我在开发的Android应用中遇到了一些奇怪的行为:
我有一个HintsMenu类(片段):
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");
}
此片段在活动中动态使用:
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()中返回此值。 在&#34; onNavigationDrawerItemSelected&#34;中,使用cl.newInstance()调用创建一个新的HintsMenu。 但是,没有调用HintsMenu的newInstance方法,但是空的构造函数是。
所以预期输出
Calling HintsMenu.newInstance()...
HintsMenu.newInstance()
Hintsmenu constructor
我只得到
Calling HintsMenu.newInstance()...
Hintsmenu constructor
如果我这样做
HintsMenu.newInstance()
我得到了预期的输出。 谁能告诉我,我做错了什么?
答案 0 :(得分:2)
newInstance()
上的静态HintsMenu
不是the newInstance()
method on Class
。你在打电话给后者。例如,如果您要将newInstance()
上的HintsMenu
重命名为newMenu()
,并且您更改了onNavigationDrawerItemSelected()
实施以尝试调用newMenu()
,那么您将获得编译错误,因为编译器会抱怨它无法在newMenu()
上找到Class
方法。