后退按钮按下处理程序
Back Button pressed handler
我正在开发一个需要 Navigation Drawer.
这个应用程序有 1 个 MainActivity 和大约 10 个片段。当我单击 MainActivity 中的导航抽屉图标时,它将显示 10 fragments
,因此我可以 select 每个。
我选择fragment
A,然后是B,然后是C...到F,例如。当我在 fragment
F 并按下后退按钮时,它将带我回到 fragment
E,然后再次返回它将带我到 fragment
D...
我需要的是当我在 fragment
中按下后退按钮时,它需要转到 navigationdrawer
中的默认主页。
我在 SO 上搜索并找到了 1 个类似的问题,但还没有答案,所以我必须提出另一个问题
你试过了吗
try {
activity.getSupportFragmentManager().popBackStackImmediate(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
} catch (IllegalStateException e)
{
e.printStackTrace();
}
在这种情况下,不要将您的 Fragments
添加到 backStack
。如果您不想在 onBackPressed()
上弹出,只需替换每个 fragment
。
getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, new AFragment()).commit();
句柄 onBackPressed()
:
@Override
public void onBackPressed() {
Fragment frag = getSupportFragmentManager().findFragmentById(R.id.containerFrame);
if (frag instanceof HomeFragment) {
// DO Onbackpress
finish();
} else {
HomeFragment fragment = new HomeFragment()
getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, fragment).commit();
}
}
在你的清单中试试这个
我想这会对你有帮助
>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Frame1"
android:label="@string/frame_1"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
<activity
android:name=".Frame2"
android:label="@string/frame_2"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
<activity
android:name=".Frame3"
android:label="@string/frame_3"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
.
.
.
.
.
</application>
我想你可以试试这个。在 onBackPressed()
中添加
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) {
getSupportFragmentManager().popBackStack();
}
} else {
super.onBackPressed();
}
您好,下面是我的解决方案,
我正在使用以下代码更改片段:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentA == null)
fragmentA = new FragmentA();
fragmentTransaction.replace(R.id.container, fragmentA);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
如果您使用的是 supportFragment,则使用 getSupportFragmentManager() 代替 getFragmentManager()。
并且当你执行 backpress 时将下面的代码放入你的 Activity 中,其中包含 Fragment。
@Override
public void onBackPressed() {
super.onBackPressed();
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
希望这个回答对您有所帮助,解决您的问题。
* The purpose of this method is set The current display ui
*
* @param id the ui that has to be displayed
*/
public void setDisplay(int id) {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
}
HideKeyboard.hideKeyboard(HomepageActivity.this);
Intent intent;
switch (id) {
//Open up home fragment
case AppConstants.DISPLAY_HOME:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
mFragment = new FragmentHome();
replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
}
break;
//opens up the setting section
case AppConstants.DISPLAY_SETTING:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentSetting)) {
mFragment = new FragmentSetting();
replaceFragment(mFragment, AppConstants.SETTING_FRAGMENT);
}
break;
//display the logout dialog
case AppConstants.DISPLAY_LOGOUT:
DialogManager.getInstance().showLogOutLogOut(this);
break;
//display the notification section
case AppConstants.DISPLAY_NOTIFICATION:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentNotification)) {
mFragment = new FragmentNotification();
replaceFragment(mFragment, AppConstants.NOTIFICATION_FRAGMENT);
}
break;
default:
//Setup Home Fragment as default fragment
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
mFragment = new FragmentHome();
replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
}
break;
}
}
/*
* 通过替换任何现有的 mFragment 来插入 mFragment
*
* @param fragment 需要替换的片段
* @param name 片段的标签
*/
public void replaceFragment(final Fragment fragment, final String name) {
if(mFragmentManager.findFragmentById(R.id.fragment_container)instanceof FragmentHome) {
mFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment, name)
.addToBackStack(name)
.commit();
} else {
mFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).
commit();
}
}
/**
* 该方法的作用是从栈中移除片段
*/
public void removeFragmentFromStack() {
if (mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome) {
exitFromApp();
} else {
mFragmentManager.popBackStackImmediate();
}
}
试试下面的代码,它对我有用。
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
final Intent startIntent = new Intent(context, MainActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(startIntent);
getActivity().finish();
}
}
return false;
}
});
return rootView;
我正在开发一个需要 Navigation Drawer.
这个应用程序有 1 个 MainActivity 和大约 10 个片段。当我单击 MainActivity 中的导航抽屉图标时,它将显示 10 fragments
,因此我可以 select 每个。
我选择fragment
A,然后是B,然后是C...到F,例如。当我在 fragment
F 并按下后退按钮时,它将带我回到 fragment
E,然后再次返回它将带我到 fragment
D...
我需要的是当我在 fragment
中按下后退按钮时,它需要转到 navigationdrawer
中的默认主页。
我在 SO 上搜索并找到了 1 个类似的问题,但还没有答案,所以我必须提出另一个问题
你试过了吗
try {
activity.getSupportFragmentManager().popBackStackImmediate(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
} catch (IllegalStateException e)
{
e.printStackTrace();
}
在这种情况下,不要将您的 Fragments
添加到 backStack
。如果您不想在 onBackPressed()
上弹出,只需替换每个 fragment
。
getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, new AFragment()).commit();
句柄 onBackPressed()
:
@Override
public void onBackPressed() {
Fragment frag = getSupportFragmentManager().findFragmentById(R.id.containerFrame);
if (frag instanceof HomeFragment) {
// DO Onbackpress
finish();
} else {
HomeFragment fragment = new HomeFragment()
getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, fragment).commit();
}
}
在你的清单中试试这个 我想这会对你有帮助 >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Frame1"
android:label="@string/frame_1"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
<activity
android:name=".Frame2"
android:label="@string/frame_2"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
<activity
android:name=".Frame3"
android:label="@string/frame_3"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.webservice.appname.MainActivity" />
</activity>
.
.
.
.
.
</application>
我想你可以试试这个。在 onBackPressed()
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) {
getSupportFragmentManager().popBackStack();
}
} else {
super.onBackPressed();
}
您好,下面是我的解决方案,
我正在使用以下代码更改片段:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentA == null)
fragmentA = new FragmentA();
fragmentTransaction.replace(R.id.container, fragmentA);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
如果您使用的是 supportFragment,则使用 getSupportFragmentManager() 代替 getFragmentManager()。
并且当你执行 backpress 时将下面的代码放入你的 Activity 中,其中包含 Fragment。
@Override
public void onBackPressed() {
super.onBackPressed();
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
希望这个回答对您有所帮助,解决您的问题。
* The purpose of this method is set The current display ui
*
* @param id the ui that has to be displayed
*/
public void setDisplay(int id) {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
}
HideKeyboard.hideKeyboard(HomepageActivity.this);
Intent intent;
switch (id) {
//Open up home fragment
case AppConstants.DISPLAY_HOME:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
mFragment = new FragmentHome();
replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
}
break;
//opens up the setting section
case AppConstants.DISPLAY_SETTING:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentSetting)) {
mFragment = new FragmentSetting();
replaceFragment(mFragment, AppConstants.SETTING_FRAGMENT);
}
break;
//display the logout dialog
case AppConstants.DISPLAY_LOGOUT:
DialogManager.getInstance().showLogOutLogOut(this);
break;
//display the notification section
case AppConstants.DISPLAY_NOTIFICATION:
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentNotification)) {
mFragment = new FragmentNotification();
replaceFragment(mFragment, AppConstants.NOTIFICATION_FRAGMENT);
}
break;
default:
//Setup Home Fragment as default fragment
if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
mFragment = new FragmentHome();
replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
}
break;
}
}
/* * 通过替换任何现有的 mFragment 来插入 mFragment * * @param fragment 需要替换的片段 * @param name 片段的标签 */
public void replaceFragment(final Fragment fragment, final String name) {
if(mFragmentManager.findFragmentById(R.id.fragment_container)instanceof FragmentHome) {
mFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment, name)
.addToBackStack(name)
.commit();
} else {
mFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).
commit();
}
}
/** * 该方法的作用是从栈中移除片段 */ public void removeFragmentFromStack() {
if (mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome) {
exitFromApp();
} else {
mFragmentManager.popBackStackImmediate();
}
}
试试下面的代码,它对我有用。
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
final Intent startIntent = new Intent(context, MainActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(startIntent);
getActivity().finish();
}
}
return false;
}
});
return rootView;