Android 使用按钮切换片段(带NavigationDrawer)

Android 使用按钮切换片段(带NavigationDrawer),android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,我有一个NavigationDrawer,我用它在Fragments之间切换。我想做的是在我的一个片段中有一个按钮,它充当NavigationDrawer中另一个Fragment的“快捷方式” 在NavigationDrawer中,我切换如下片段: private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public

我有一个
NavigationDrawer
,我用它在
Fragment
s之间切换。我想做的是在我的一个片段中有一个按钮,它充当
NavigationDrawer
中另一个
Fragment
的“快捷方式”

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;
    }
在片段B(位置1)中:


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

首先,在
上选择item
方法,使用
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);
}
其次,
Navigation\u Drawer
中的
getInstance
方法不应创建新的
Navigation\u Drawer
instance
为空时,在
导航\u Drawer
中创建
this
中设置instance,然后在调用
getInstance
时返回
instance

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。您可以在
QuickNoteFragment
中转到
PendViewPager

Navigation_Drawer.getInstance().selectItem(1);
-

更新1:如何将数据传递到片段:
QuickNoteFragment
HistoryFragment
具有相同的父类:
FragmentBase
,我们添加了一个名为
onDataIn
的方法来接收数据:

public class FragmentBase extends Fragment {

    public void function onDataIn(Object data) {
    }
}
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
,添加参数以接收数据:

public class FragmentBase extends Fragment {

    public void function onDataIn(Object data) {
    }
}
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。

谢谢。我还有一个小问题——如果我在按下按钮时使用它,我会用按钮将数据从片段传递到我想要的片段。在start()和on resume()上都没有调用,所以我无法接收意图。也许ifVisibleToUser会起作用。我会尝试的。我给出了一些关于将数据传递到片段的代码,希望它会有所帮助。谢谢-我已经运行了它,但是我不知道当我在另一个片段中时如何检索数据。我添加了
Navigation\u Drawer.getInstance().selectItem(0,“mytext”)
在HistoryFragments中,您可以覆盖
onDataIn
方法来处理要在其中检索数据的片段中的数据。