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

时间:2015-08-13 17:05:33

标签: java android constructor fragment

我在开发的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()

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

1 个答案:

答案 0 :(得分:2)

newInstance()上的静态HintsMenu不是the newInstance() method on Class。你在打电话给后者。例如,如果您要将newInstance()上的HintsMenu重命名为newMenu(),并且您更改了onNavigationDrawerItemSelected()实施以尝试调用newMenu(),那么您将获得编译错误,因为编译器会抱怨它无法在newMenu()上找到Class方法。