我在我的应用程序中使用SlidingMenu实现,我希望android.R.id.home按钮打开/关闭侧面菜单。在 Activity 内部,我使用 Fragment 来显示信息。我希望主页按钮充当后退按钮。
问题是Activity 中的 onOptionsItemSelected在Fragment之前被调用。这是普通行为吗?还是我做错了什么?
我也在我的项目中使用 ActionBarSherlock,但我认为这并不重要。
实现我自己的界面是这里唯一的解决方案吗?
我在我的应用程序中使用SlidingMenu实现,我希望android.R.id.home按钮打开/关闭侧面菜单。在 Activity 内部,我使用 Fragment 来显示信息。我希望主页按钮充当后退按钮。
问题是Activity 中的 onOptionsItemSelected在Fragment之前被调用。这是普通行为吗?还是我做错了什么?
我也在我的项目中使用 ActionBarSherlock,但我认为这并不重要。
实现我自己的界面是这里唯一的解决方案吗?
就在昨晚,我一直在努力解决这个问题,但最终设法解决了它,所以这是我的解决方案:这些是 MainActivity 的相关部分:
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
public class MainActivity extends SherlockFragmentActivity {
.
.
.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
return super.onOptionsItemSelected(item);
}
}
这是我的菜单 main.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
这是我的片段:
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public class TestFrag extends SherlockFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add(Menu.NONE, android.R.id.home, 100, "Home");
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId())
{
case android.R.id.home:
// Do whatever you want when Home is clicked.
Toast.makeText(getSherlockActivity(), "Home is clicked", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
这就是我得到的:
我希望这会有所帮助。
最终将 onOptionsItemSelected 从 Activity 移动到我的基本 Fragment 类。
在基片段类中,我有这些:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
// Toggle slide menu
getBaseActivity().getSlidingMenu().toggle(true);
break;
}
return super.onOptionsItemSelected(item);
}
protected boolean useHomeAsBack(MenuItem item){
switch(item.getItemId()){
case android.R.id.home:
Log.v(TAG, "useHomeAsBack - onOptionsItemSelected");
getSherlockActivity().onBackPressed();
return true;
}
return false;
}
也叫setHasOptionsMenu(true);
里面onAttach
。
在我想使用的实际 Fragment 中,我有:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(useHomeAsBack(item)) return true;
return super.onOptionsItemSelected(item);
}
不过,我希望 Fragment 的 onOptionsItemSelected 能够覆盖或优先于 Activity 的。想知道那会是什么原因。