工具栏后退按钮不关闭当前片段
Toolbar back button does not close current Fragment
我有一个 activity 在创建时加载片段。我在那个 activity 上有一个工具栏,它有一个按钮,单击该按钮会在第一个创建的片段之上添加一个新片段。
现在在该工具栏上,单击时,我想删除较新的片段,这样它就可以取代底部的片段(较旧的片段)。我已经搜索过了,除了一件事我有点想通了。
我这样做是为了查看是否按下了工具栏按钮:
@Override
public boolean onKeyUp(int keyCode, KeyEvent objEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
return super.onKeyUp(keyCode, objEvent);
}
@Override
public void onBackPressed() {
FragmentManager mFM = getSupportFragmentManager();
if(mFM.findFragmentByTag("NewFragment") != null){
mFM.beginTransaction().remove(mFM.findFragmentByTag("NewFragment")).commit();
}
}
问题是,当您单击 "hardware's back button" 而不是工具栏的后退按钮时,"keyCode" 仅等于 KEYCODE_BACK。它给我的是键码 58 而不是 4 (KEYCODE_BACK)。
从您的问题中不清楚您是在询问片段管理问题(FragmentTransaction 删除与替换)还是工具栏按钮问题。我假设后者...
Android 工具栏或操作栏应使用以下方式处理操作:
@Override
public Boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case MY_BACK_BUTTON:
myBackPressedHandler();
return (true);
}
return (false);
}
这假定您的“后退”按钮已添加为 MenuItem,并被赋予了 MY_BACK_BUTTON 的 ID。
对于工具栏,您可以使用 MenuItemClickListener 来处理点击事件:
mToolbar.setOnMenuItemClickListener(MenuItem menuItem)
{
@Override
public Boolean onMenuItemClick(MenuItem menuItem)
{
// call onOptionsItemSelected, or handle the click here directly
return (thisFragment.onOptionsItemSelected(menuItem));
}
});
如果您指的是 Toolbar/ActionBar 上的 "Up" 按钮,即 setDisplayHomeAsUpEnabled(true),这将有一个 android.R.id.home 的 getItemId() 并且可以在相似时尚:
case android.R.id.home:
myBackPressedHandler();
return (true);
我相信您正在寻找 Toolbar
小部件的 NavigationListener
:
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
但是如果您使用带有 ActionBar
的主题并设置 supportActionBar,那么请执行以下操作:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
onBackPressed();
break;
}
return true;
}
我有一个 activity 在创建时加载片段。我在那个 activity 上有一个工具栏,它有一个按钮,单击该按钮会在第一个创建的片段之上添加一个新片段。
现在在该工具栏上,单击时,我想删除较新的片段,这样它就可以取代底部的片段(较旧的片段)。我已经搜索过了,除了一件事我有点想通了。
我这样做是为了查看是否按下了工具栏按钮:
@Override
public boolean onKeyUp(int keyCode, KeyEvent objEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
return super.onKeyUp(keyCode, objEvent);
}
@Override
public void onBackPressed() {
FragmentManager mFM = getSupportFragmentManager();
if(mFM.findFragmentByTag("NewFragment") != null){
mFM.beginTransaction().remove(mFM.findFragmentByTag("NewFragment")).commit();
}
}
问题是,当您单击 "hardware's back button" 而不是工具栏的后退按钮时,"keyCode" 仅等于 KEYCODE_BACK。它给我的是键码 58 而不是 4 (KEYCODE_BACK)。
从您的问题中不清楚您是在询问片段管理问题(FragmentTransaction 删除与替换)还是工具栏按钮问题。我假设后者...
Android 工具栏或操作栏应使用以下方式处理操作:
@Override
public Boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case MY_BACK_BUTTON:
myBackPressedHandler();
return (true);
}
return (false);
}
这假定您的“后退”按钮已添加为 MenuItem,并被赋予了 MY_BACK_BUTTON 的 ID。
对于工具栏,您可以使用 MenuItemClickListener 来处理点击事件:
mToolbar.setOnMenuItemClickListener(MenuItem menuItem)
{
@Override
public Boolean onMenuItemClick(MenuItem menuItem)
{
// call onOptionsItemSelected, or handle the click here directly
return (thisFragment.onOptionsItemSelected(menuItem));
}
});
如果您指的是 Toolbar/ActionBar 上的 "Up" 按钮,即 setDisplayHomeAsUpEnabled(true),这将有一个 android.R.id.home 的 getItemId() 并且可以在相似时尚:
case android.R.id.home:
myBackPressedHandler();
return (true);
我相信您正在寻找 Toolbar
小部件的 NavigationListener
:
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
但是如果您使用带有 ActionBar
的主题并设置 supportActionBar,那么请执行以下操作:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
onBackPressed();
break;
}
return true;
}