[英]Back Press on fragments
I am using sliding menu in my app and starts fragments from MainActivity i want to close application when back button is pressed. 我在应用程序中使用滑动菜单,并从MainActivity启动片段,我想在按下后退按钮时关闭应用程序。 what it is doing that it opens the activity when back button is pressed in last fragment but i want to exit the app when back button is pressed in last fragment. 在最后一个片段中按下后退按钮时,它会打开活动,但是在最后一个片段中按下后退按钮时,我想退出该应用程序。 how can i do this. 我怎样才能做到这一点。
this is my on create 这是我创造的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setBackgroundDrawable(
new ColorDrawable(Color.parseColor("#0057b3")));
setContentView(R.layout.activity_main);
graphicUtil = new GraphicsUtil();
mTitle = mDrawerTitle = getTitle();
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 = new ArrayList<NavDrawerItem>();
// My Feeds
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
.getResourceId(0, -1)));
// Private Feeds
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
.getResourceId(1, -1)));
// My Profile
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
.getResourceId(2, -1)));
// People and Groups
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons
.getResourceId(3, -1)));
// Messages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons
.getResourceId(4, -1)));
// Favorites
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons
.getResourceId(5, -1)));
// Credits
navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons
.getResourceId(6, -1)));
// Settings
navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons
.getResourceId(7, -1)));
// About this app
navDrawerItems.add(new NavDrawerItem(navMenuTitles[8], navMenuIcons
.getResourceId(8, -1)));
// Contact us
navDrawerItems.add(new NavDrawerItem(navMenuTitles[9], navMenuIcons
.getResourceId(9, -1)));
// Log Out
navDrawerItems.add(new NavDrawerItem(navMenuTitles[10], navMenuIcons
.getResourceId(10, -1)));
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.app_name, R.string.app_name) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// open default fragment
if (savedInstanceState == null) {
displayView(0);
}
}
this my display view method that opens the fragments 这是我的显示视图方法,可打开片段
private void displayView(int position) {
switch (position) {
case 0:
// fragment = new MyPublicPostsFragment();
fragment = new MyFeedsFragment();
break;
case 1:
fragment = new MyPrivatePostsFragment();
break;
case 2:
fragment = new MyProfileFragment();
break;
case 3:
fragment = new PeopleFragment();
break;
case 4:
fragment = new MessagesFragment();
break;
case 5:
fragment = new FavouritesFragment();
break;
case 6:
fragment = new CreditsFragment();
break;
case 7:
fragment = new SettingsFragment();
break;
case 8:
fragment = new AboutThisAppFragment();
break;
case 9:
fragment = new ContactUsFragment();
break;
case 10:
fragment = new LogOutFragment();
store.setLoginStatus(null);
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment)
.addToBackStack(null).commit();
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
Log.e("Main Activity", "error in creating fragment");
}}
any help would be greatly appreciated 任何帮助将不胜感激
Thanx in advance 提前感谢
Remove addToBackStack() from here: .addToBackStack(null).commit();
从此处删除addToBackStack() .addToBackStack(null).commit();
http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String) http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)
Put the following code in your MainActivity().java 将以下代码放入您的MainActivity()。java中
@Override
public void onBackPressed()
{
// Do Here what ever you want do on back press;
finish();
}
There are several ways of doing this (some betters than others): 有几种方法可以做到这一点(比其他方法更好):
Way 1: Perform a fragment transaction with a TAG string. 方式1:使用TAG字符串执行片段事务。 That way in onBackPressed()
on the MainActivity you can check with findFragmentByTag
what the current fragment is, if is the fragment you want to exit, then exit, if not do nothing. 这样,您可以在MainActivity的onBackPressed()
使用findFragmentByTag
检查当前片段是什么,如果要退出的片段是,然后退出,如果不执行任何操作。
Way 2: As your displayView
method is using a switch you can store the integer position in your MainActivity, that way in onBackPressed()
you can check what integer is, and therefore you can know what fragment is. 方式2:当displayView
方法使用开关时,您可以在MainActivity中存储整数位置,在onBackPressed()
您可以检查整数是什么,因此可以知道什么是片段。
Way 3: You can also create a variable called mCurrentFragment
to store the current fragment, in onBackPressed()
you can check with instanceOf
what fragment is, and apply the same logic. 方式3:您还可以创建一个名为mCurrentFragment
的变量来存储当前片段,在onBackPressed()
您可以使用instanceOf
检查什么是片段,并应用相同的逻辑。
Way 4: You can create a listener that the fragments must implement and when calling onBackPressed
, then call the listener and do whatever you need to do. 方式4:您可以创建片段必须实现的侦听器,并在调用onBackPressed
,然后调用该侦听器并执行所需的任何操作。
If you need code examples tell me and I'll add it gladly. 如果您需要代码示例,请告诉我,我会很乐意添加。
EDIT 1: 编辑1:
Keep in mind that this is pseudocode, it may contain any typo or something, check it properly with the compiler. 请记住,这是伪代码,它可能包含任何错字或其他内容,请使用编译器进行正确检查。
In your MainActivity.java: 在您的MainActivity.java中:
public class MainActivity extends FragmentActivity {
// Code...
private Fragment mCurrentFragment;
// Code...
private void displayView(int position) {
switch (position) {
case 0:
mCurrentFragment = new MyFeedsFragment();
break;
// Substitute fragment for mCurrentFragment in the rest of the method...
}
@Override
public void onBackPressed() {
if (mCurrentFragment instanceof LogOutFragment) {
finish();
} else {
// Do whatever you want to do if necessary
}
}
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.