用按钮切换片段(带导航抽屉)

时间:2013-08-18 19:25:50

标签: android android-fragments navigation-drawer

我有一个NavigationDrawer,用于在Fragment之间切换。我想要做的是在我的一个片段中有一个按钮,它作为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 

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

1 个答案:

答案 0 :(得分:1)

首先,在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中的Navigation_Drawer方法在Navigation_Drawer为空时不应创建新的instance,在this中将实例设置为onCreateNavigation_Drawer中,然后在致电instance时返回getInstance

private static Navigation_Drawer mInstance;

public static Navigation_Drawer getInstance() {
    return mInstance;
}

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

QuickNoteFragment的ID为0,PendViewPager的ID为1.您可以转到PendViewPager中的QuickNoteFragment

Navigation_Drawer.getInstance().selectItem(1);

-

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

QuickNoteFragmentHistoryFragement具有相同的父类: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的旧代码,也不需要将数据传递给fragement。

相关问题