0

我有一个NavigationDrawer用来在Fragments 之间切换的。我想做的是在我的一个片段中有一个按钮,它Fragment充当NavigationDrawer.

NavigationDrawer我这样切换片段中:

private class DrawerItemClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            selectItem(position);
        }
    }

public void selectItem(int position) { 

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        String fragmentTag = String.valueOf(position);

        FragmentBase fragment = (FragmentBase) fragmentManager
                .findFragmentByTag(fragmentTag);
        if (null == fragment) { 
            fragment = createFragmentByPosition(position);
        }
        if (null == fragment)
            return;

        if (fragment.isAdded()) {
            fragmentTransaction.show(fragment);
        } else {
            fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag); 
        }

        if (mCurrentFragment != null) {
            fragmentTransaction.hide(mCurrentFragment);
        }
        mCurrentFragment = fragment;
        fragmentTransaction.commitAllowingStateLoss();

        mDrawerList.setItemChecked(position, true);
        setTitle(mNoterActivities[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    }

    private FragmentBase createFragmentByPosition(int position) { // FragmentBase just extends Fragment
        FragmentBase fragment = null;

        if (position == 0) {
            fragment = new Fragment1();
            Bundle args = new Bundle();
            fragment.setArguments(args);

        } else if (position == 1) { // Reminder
            fragment = new Fragment2();
            Bundle args = new Bundle();
            fragment.setArguments(args);

        }

        return fragment;
    }

我不知道我会怎么做。我尝试获取 NavigationDrawer 类的实例,然后使用所需位置调用 selectItem,但这不起作用,因为它给出了错误“找不到视图”。

在 NavigationDrawer 类中:

public Navigation_Drawer getInstance() {
        if (null == instance) {
            instance = new Navigation_Drawer();
        }
        return instance;
    }

在 FragmentB(位置 1)中:

//onClick
    Navigation_Drawer nd = new Navigation_Drawer().getInstance(); 
             nd.selectItem(0); // Try to go to FragmentA 

这似乎太简单了,难怪它不起作用!

4

1 回答 1

0

首先,关于selectItem方法,使用add方法而不是replace方法:

public void selectItem(int position) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    String fragmentTag = String.valueOf(position);

    FragmentBase fragment = (FragmentBase) fragmentManager.findFragmentByTag(fragmentTag);
    if (null == fragment) {
        fragment = createFragmentByPosition(position);
    }
    if (null == fragment)
        return;

    if (fragment.isAdded()) {
        fragmentTransaction.show(fragment);
    } else {
        // fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag); 
        fragmentTransaction.add(R.id.content_frame, fragment, fragmentTag);
    }

    if (mCurrentFragment != null) {
        fragmentTransaction.hide(mCurrentFragment);
    }
    mCurrentFragment = fragment;
    fragmentTransaction.commitAllowingStateLoss();

    mDrawerList.setItemChecked(position, true);
    setTitle(mNoterActivities[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

其次,getInstance方法 in不应该在为 null时Navigation_Drawer创建新的,将实例设置为in in ,然后在调用时返回:Navigation_DrawerinstancethisonCreateNavigation_DrawerinstancegetInstance

private static Navigation_Drawer mInstance;

public static Navigation_Drawer getInstance() {
    return mInstance;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    mInstance = this;
    // other codes here:
}

的 idQuickNoteFragment为 0,toPendViewPager为 1。您可以转到PendViewPagerin QuickNoteFragment

Navigation_Drawer.getInstance().selectItem(1);

-

update1:​​如何将数据传递给片段:

QuickNoteFragment并且HistoryFragement具有相同的父类:FragmentBase,我们添加一个名为onDataIn接收数据的方法:

public class FragmentBase extends Fragment {

    public void function onDataIn(Object data) {
    }
}

我们应该改变selectItem,添加一个参数来接收数据:

public void selectItem(int position, Object data) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    String fragmentTag = String.valueOf(position);

    FragmentBase fragment = (FragmentBase) fragmentManager.findFragmentByTag(fragmentTag);
    if (null == fragment) {
        fragment = createFragmentByPosition(position);
    }
    if (null == fragment)
        return;

    // call onDataIn() method.
    fragment.onDataIn(data);

    if (fragment.isAdded()) {
        fragmentTransaction.show(fragment);
    } else {
        // fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag); 
        fragmentTransaction.add(R.id.content_frame, fragment, fragmentTag);
    }

    if (mCurrentFragment != null) {
        fragmentTransaction.hide(mCurrentFragment);
    }
    mCurrentFragment = fragment;
    fragmentTransaction.commitAllowingStateLoss();

    mDrawerList.setItemChecked(position, true);
    setTitle(mNoterActivities[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

为了使selectItem兼容,我们应该添加一个重载selectItem方法。

public void selectItem(int postion) {
    selectItem(position, null);
}

这样,我们不需要更改调用的旧代码,selectItem也不需要将数据传递给fragment。

于 2013-08-25T17:34:40.863 回答