[英]How to use back pressed options fragment to fragment in android
Back press is not working from fragment to fragment.(my application contains navigation drawer and Tab view.) My Main Activity code is given below.i have added the back press method please help me.... 从片段到片段,反向按不起作用。(我的应用程序包含导航抽屉和Tab视图。)下面提供了我的主要活动代码。我添加了反向按的方法,请帮助我。
public class Main Activity extends Activity {
ImageView image;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
ExpandableListView expListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Runtime.getRuntime().maxMemory();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));
navDrawerItems.add(new NavDrawerItem(navMenuTitles[6],
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// mDrawerLayout.setBackgroundDrawable(new ColorDrawable(R.drawable.border));
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
ActionBar actionBar = getActionBar();
// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
actionBar.setCustomView(R.layout.custom_view);
// actionBar.setCustomView(R.layout.custom_view1);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.show();
addListenerOnButton();
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.draw,//nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
}
return true;
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new FirstFragment();
break;
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new FindPeopleFragment();
break;
case 3:
fragment = new PhotosFragment();
break;
case 4:
fragment = new PagesFragment();
break;
case 5:
fragment = new CommunityFragment();
break;
default:
break;
}
**Edited Code:**
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.frame_container, fragment);
// Add this transaction to the back stack, so when the user presses back,// it rollbacks.
ft.commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
private void addListenerOnButton() {
// TODO Auto-generated method stub
image = (ImageView) findViewById(R.id.actionBarLogo);
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Fragment fd2 = new MovieActivity();
android.app.FragmentTransaction ft2 =
getFragmentManager().beginTransaction();
ft2.replace(R.id.frame_container, fd2);
ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft2.addToBackStack(null);
ft2.commit();
}
});
}
@Override
public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
}
else {
getFragmentManager().popBackStack();
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
Inside your activity
which handles all the fragments , use 在处理所有碎片的
activity
中,使用
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
}
else {
getSupportFragmentManager().popBackStack();
}
}
When the fragment backstack entry count is 0 , it means all the fragments are popped out of the backstack. 当片段Backstack条目计数为0时,意味着所有片段都从Backstack中弹出。 So you just execute the
super.onBackPressed()
then. 因此,您只需执行
super.onBackPressed()
。 However when the stack is not empty , when you press back button you need to pop the top most fragment from the backstack so that proper back navigation happens. 但是,当堆栈不为空时,按后退按钮时,您需要从后堆栈中弹出最上面的片段,以便进行正确的后退导航。
Note : use getFragmentManager().getBackStackEntryCount()
instead of getSupportFragmentManager().getBackStackEntryCount()
if you are importing android.app.Fragment
. 注意:如果要导入
android.app.Fragment
请使用getFragmentManager().getBackStackEntryCount()
而不是getSupportFragmentManager().getBackStackEntryCount()
。
Edit 编辑
Now that you have changed your onBackPressed()
code , next thing to do is change this in your code. 既然您已经更改了
onBackPressed()
代码,接下来要做的就是在您的代码中进行更改。
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame_container, fragment);
// Add this transaction to the back stack, so when the user presses back,// it rollbacks.
ft.addToBackStack("Give a Tag for the fragment here");
ft.commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
Basically what we are doing here is adding a particular fragment to the fragment backstack while replacing it so that while onBackPressed()
of activity is executed count
variable will store the number of fragments present in the fragment backstack , and proper back navigation occurs then. 基本上,我们在这里要做的是在替换特定片段的同时将其添加到片段堆栈中,以便在执行活动的
onBackPressed()
, count
变量将存储片段堆栈中存在的片段数量,然后进行适当的向后导航。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.