如何使用回pressed选择片段片段的android [英] How to use back pressed options fragment to fragment in android
问题描述
返回preSS不会从片段努力片段。(我的应用程序中包含导航抽屉标签视图)给出我的主要活动code below.i添加了回来preSS方法,请大家帮帮忙我....
公共类主要活动延伸活动{ ImageView的形象;
私人DrawerLayout mDrawerLayout;
私人的ListView mDrawerList;
私人ActionBarDrawerToggle mDrawerToggle;
//导航抽屉称号
私人CharSequence的mDrawerTitle;
//用于存储应用程序标题
私人CharSequence的mTitle;
//滑动菜单项
私有String [] navMenuTitles;
私人TypedArray navMenuIcons;
私人的ArrayList< NavDrawerItem> navDrawerItems;
私人NavDrawerListAdapter适配器; ExpandableListView expListView; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main); 调用Runtime.getRuntime()maxMemory()。
//负荷滑动菜单项
navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。 从资源//导航抽屉图标
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons); mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerList =(ListView控件)findViewById(R.id.list_slidermenu);
navDrawerItems =新的ArrayList< NavDrawerItem>();
//首页
navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1)));
//找人
navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1)));
// 相片
navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1)));
//社区,这里将添加计数器
navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1)));
//网页
navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1)));
//什么是热的,我们将在这里添加计数器
navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1)));
navDrawerItems.add(新NavDrawerItem(navMenuTitles [6],
//回收类型数组
navMenuIcons.recycle(); mDrawerList.setOnItemClickListener(新SlideMenuClickListener());
// mDrawerLayout.setBackgroundDrawable(新ColorDrawable(R.drawable.border));
//设置导航抽屉名单适配器
适配器=新NavDrawerListAdapter(getApplicationContext()
navDrawerItems);
mDrawerList.setAdapter(适配器);
动作条动作条= getActionBar();
//使操作栏中的应用程序图标和行为作为切换按钮
getActionBar()setDisplayHomeAsUpEnabled(真)。
getActionBar()setHomeButtonEnabled(真)。
actionBar.setHomeButtonEnabled(真);
actionBar.setBackgroundDrawable(新ColorDrawable(Color.WHITE)); actionBar.setCustomView(R.layout.custom_view);
// actionBar.setCustomView(R.layout.custom_view1);
actionBar.setDisplayShowCustomEnabled(真);
actionBar.show();
addListenerOnButton(); mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
R.drawable.draw,//导航菜单切换图标
R.string.app_name,//导航抽屉打开 - 描述的可访问性
R.string.app_name //导航抽屉接近 - 描述的可访问性
){
公共无效onDrawerClosed(查看视图){
。getActionBar()的setTitle(mTitle);
//调用prepareOptionsMenu()来显示操作栏图标
invalidateOptionsMenu();
} 公共无效onDrawerOpened(查看drawerView){
。getActionBar()的setTitle(mDrawerTitle);
//调用prepareOptionsMenu()隐藏操作栏图标
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle); 如果(savedInstanceState == NULL){
//对第一个项目的资产净值首次显示视图
displayView(0);
}
} / **
*滑动菜单项,点击监听器
* * / 私有类SlideMenuClickListener工具
ListView.OnItemClickListener {
@覆盖
公共无效onItemClick(适配器视图<>母公司,观景,INT位置,
长ID){
//选定导航抽屉项显示视图
displayView(位置);
}
} @覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
} @覆盖
公共布尔onOptionsItemSelected(菜单项项){
//切换上选择操作栏中的应用程序图标/标题导航抽屉
如果(mDrawerToggle.onOptionsItemSelected(项目)){ } 返回true; }
/ **
所选导航抽屉列表项* Diplaying片段视图
* * /
私人无效displayView(INT位置){
//更新替换片段的主要内容
片段片段= NULL; 开关(位置){
情况下0:
片段=新FirstFragment();
打破;
情况1:
片段=新HomeFragment();
打破;
案例2:
片段=新FindPeopleFragment();
打破;
案例3:
片段=新PhotosFragment();
打破;
情况4:
片段=新PagesFragment();
打破;
情况5:
片段=新CommunityFragment();
打破; 默认:
打破;
}
**编辑code:**如果(片段!= NULL){
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction英尺= fragmentManager.beginTransaction(); ft.addToBackStack(NULL);
ft.replace(R.id.frame_container,片段); //这个交易添加到后面堆栈,因此当用户presses回来,//它回滚。 ft.commit(); //更新所选项目和标题,然后关上抽屉
mDrawerList.setItemChecked(位置,真正的);
mDrawerList.setSelection(位置);
(navMenuTitles [位置])的setTitle;
mDrawerLayout.closeDrawer(mDrawerList);
}其他{
//错误创建片段
Log.e(MainActivity,出错创建片段);
} }
@覆盖
公共无效的setTitle(CharSequence的标题){
mTitle =称号;
。getActionBar()的setTitle(mTitle);
} 私人无效addListenerOnButton(){
// TODO自动生成方法存根 图像=(ImageView的)findViewById(R.id.actionBarLogo); image.setOnClickListener(新OnClickListener(){ @覆盖
公共无效的onClick(视图v){ 片段FD2 =新MovieActivity();
android.app.FragmentTransaction平方英尺=
。getFragmentManager()的BeginTransaction();
ft2.replace(R.id.frame_container,FD2);
ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft2.addToBackStack(NULL);
ft2.commit();
}
});
}
@覆盖
公共无效onBack pressed(){
诠释计数= getFragmentManager()getBackStackEntryCount()。
如果(计数== 0){
super.onBack pressed();
}
其他{
getFragmentManager()popBackStack()。
}
}
@覆盖
保护无效onPostCreate(捆绑savedInstanceState){
super.onPostCreate(savedInstanceState);
//同步onRestoreInstanceState后切换状态已经发生。
mDrawerToggle.syncState();
} @覆盖
公共无效onConfigurationChanged(配置NEWCONFIG){
super.onConfigurationChanged(NEWCONFIG);
//把任何配置更改抽屉toggls
mDrawerToggle.onConfigurationChanged(NEWCONFIG);
} }
在你的活动
负责处理所有的片段,用
@覆盖
公共无效onBack pressed(){
诠释计数= getSupportFragmentManager()getBackStackEntryCount()。
如果(计数== 0){
super.onBack pressed();
}
其他{
getSupportFragmentManager()popBackStack()。
}
}
在片段backstack项数为0,这意味着所有的片段被弹出了backstack的。所以,你只需要执行 super.onBack pressed()
即可。然而,当栈不为空,当你preSS后退按钮,你需要从backstack弹出最顶层的片段,使正确的后退导航发生。
注意:使用 getFragmentManager()getBackStackEntryCount()
而不是 getSupportFragmentManager()getBackStackEntryCount()
如果您导入 android.app.Fragment
。
修改
现在你已经改变了你的 onBack pressed()
code,接下来要做的事情是在你的code改变这一点。
如果(片段!= NULL){
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction英尺= fragmentManager.beginTransaction(); ft.replace(R.id.frame_container,片段); //这个交易添加到后面堆栈,因此当用户presses回来,//它回滚。 ft.addToBackStack(给该片段的标签在这里);
ft.commit(); //更新所选项目和标题,然后关上抽屉
mDrawerList.setItemChecked(位置,真正的);
mDrawerList.setSelection(位置);
(navMenuTitles [位置])的setTitle;
mDrawerLayout.closeDrawer(mDrawerList);
}其他{
//错误创建片段
Log.e(MainActivity,出错创建片段);
}
基本上我们在这里做的是增加特定片段的片段backstack而取代它,这样当 onBack pressed()被执行
活动的计数
变量将片段present的号码存储在片段backstack,然后适当后退导航时发生。
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....
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
@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. So you just execute the super.onBackPressed()
then. 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
.
Edit
Now that you have changed your onBackPressed()
code , next thing to do is change this in your code.
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.
这篇关于如何使用回pressed选择片段片段的android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!