Raj*_*epe 39 android back android-fragments
我现在有一个包含片段的活动
[1],[2],[3],[4]
如果按下按钮[3],可以将其重定向到[4]
我想实现后退按钮如下图所示..
当按下[4]时,返回[3]
当按下[3]时,返回[2]
当按下[1]时,活动结束();
当涉及到当前的实现时,它完成活动而不是弹出Fragment.你能告诉我我应该做什么或记住什么?
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if( keyCode==KeyEvent.KEYCODE_BACK)
{
finish();
}
return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)
小智 88
这对我有用.
- 从活动中调用新片段时,添加.addToBackStack(null).
FragmentTransaction mFragmentTransaction = getFragmentManager()
.beginTransaction();
....
mFragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)
- 将onBackPressed()添加到您的活动中
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
getFragmentManager().popBackStack();
}
}
Run Code Online (Sandbox Code Playgroud)
Hir*_*tel 54
最简单的方式:
onResume():
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button's click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud)
编辑1:如果片段有EditText
.
private EditText editText;
Run Code Online (Sandbox Code Playgroud)
onCreateView():
editText = (EditText) rootView.findViewById(R.id.editText);
Run Code Online (Sandbox Code Playgroud)
onResume():
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editText.clearFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button's click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud)
注意: 如果您在片段中有EditText,它将起作用.
完成
这对我来说是一个有效的解决方案:
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// DO WHAT YOU WANT ON BACK PRESSED
return true;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:您可以用getView()
片段替换对话框.
你可以用这个..为我工作..
看起来好像片段[3]在按下后面时没有从视图中移除,所以你必须手动完成!
首先,不要使用replace(),而是使用remove并单独添加.似乎replace()无法正常工作.
下一部分是重写onKeyDown方法,并在每次按下后退按钮时删除当前片段.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
{
this.finish();
return false;
}
else
{
getSupportFragmentManager().popBackStack();
removeCurrentFragment();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.f_id);
}
Run Code Online (Sandbox Code Playgroud)
试试这个简单的方案:
在你的活动中实现onBackPressed
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
getSupportFragmentManager().popBackStack();
} else {
finish();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想在每次背压时弹出顶部片段,这将有效. 注意: - 在向活动添加片段时,总是将事务添加到后台,以使其工作
我解决问题的方法我相信它也会对您有所帮助:
1.如果您的片段中没有任何编辑文本框,您可以使用以下代码
这里 MainHomeFragment 是主要 Fragment (当我从第二个片段按后退按钮时,它也会带我 MainHomeFragment )
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
}); }
Run Code Online (Sandbox Code Playgroud)
2.如果您有另一个名为 Somefragment 的片段,并且它有编辑文本框,那么您可以通过这种方式完成。
private EditText editText;
Run Code Online (Sandbox Code Playgroud)
然后在,
onCreateView():
editText = (EditText) view.findViewById(R.id.editText);
Run Code Online (Sandbox Code Playgroud)
然后重写OnResume,
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editTextOFS.clearFocus();
getView().requestFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud)
这就是大家(amitamie.com):-) ;-)
在包含片段的活动的 onCreate() 中,添加一个 backstack 更改侦听器,如下所示:
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
List<Fragment> f = fragmentManager.getFragments();
Fragment frag = f.get(0);
currentFragment = frag.getClass().getSimpleName();
}
});
Run Code Online (Sandbox Code Playgroud)
(注意。我的 fragmentManager 被声明为全局)现在每次更改片段时,currentFragment 字符串将成为当前片段的名称。然后在 onBackPressed() 活动中,您可以像这样控制后退按钮的操作:
@Override
public void onBackPressed() {
switch (currentFragment) {
case "FragmentOne":
// your code here
return;
case "FragmentTwo":
// your code here
return;
default:
fragmentManager.popBackStack();
// default action for any other fragment (return to previous)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以确认这种方法对我有用。
更新:科特林
override fun onBackPressed() {
when(supportFragmentManager.fragments[0].javaClass.simpleName){
"FragmentOne" -> doActionOne()
"FragmentTwo" -> doActionTwo()
else -> supportFragmentManager.popBackStack()
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
116138 次 |
最近记录: |