gpt4 book ai didi

java - 调用 Fragment 的空构造函数而不是 newInstance

转载 作者:行者123 更新时间:2023-11-30 08:48:22 24 4
gpt4 key购买 nike

我在开发的 Android 应用程序中遇到了一些奇怪的行为:

我有一个类 HintsMenu( fragment ):

public class HintsMenu extends Fragment implements AbsListView.OnItemClickListener {

...


/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static HintsMenu newInstance() {
System.out.println("HintsMenu.newInstance()");
HintsMenu fragment = new HintsMenu();
Bundle args=new Bundle();
args.putString(ARG_TITLE,"Hints");
fragment.setArguments(args);
return fragment;
}

/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public HintsMenu() {
System.out.println("Hintsmenu constructor");
}

此 fragment 在 Activity 中动态使用:

public class MainActivity extends ActionBarActivity implements MainMenu.NavigationDrawerCallbacks {

....

@Override
public void onNavigationDrawerItemSelected(MenuEntry item) {
// update the main content by replacing fragments
if (item.hasActivity()){
...
} else if (item.hasFragment()){
try {
FragmentManager fragmentManager = getSupportFragmentManager();
Class<? extends Fragment> cl=item.getFragmentClass();
System.out.println("Calling " + cl.getSimpleName() + ".newInstance()...");
Fragment newFragment=cl.newInstance();
fragmentManager.beginTransaction().replace(R.id.container, newFragment).commit();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

想法是,item.activityClass(代码未显示)由表达式设置

item.fragmentClass=HintsMenu.class;

在代码的另一个位置,item.getFragmentClass() 在 onNavigationDrawerItemSelected() 中返回这个值。在“onNavigationDrawerItemSelected”中,使用 cl.newInstance() 调用创建了一个新的 HintsMenu。但是,没有调用 HintsMenu 的 newInstance 方法,而是调用了空的 Constructor。

所以安装了预期的输出

Calling HintsMenu.newInstance()...
HintsMenu.newInstance()
Hintsmenu constructor

我只得到

Calling HintsMenu.newInstance()...
Hintsmenu constructor

如果我这样做

HintsMenu.newInstance()

我得到了预期的输出。谁能告诉我,我做错了什么?

最佳答案

HintsMenu 上的静态newInstance() 不是the newInstance() method on Class .您正在调用后者。例如,如果您要将 HintsMenu 上的 newInstance() 重命名为 newMenu(),并且您更改了 onNavigationDrawerItemSelected() 尝试调用 newMenu() 的实现,你会得到一个编译错误,因为编译器会提示它无法在 上找到 newMenu() 方法>类

关于java - 调用 Fragment 的空构造函数而不是 newInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31994424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com