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
方法来处理要在其中检索数据的片段中的数据。