我想在Android应用程序中实现up按钮,只有一个活动用不同的片段更改其内容。 我使用android studio提供的默认导航抽屉活动,其中我将frameLayout添加到content_main。 在我希望显示up botton的片段中,我在onCreateView方法中添加了这行代码:
ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
在onCreate方法中添加此行:
setHasOptionsMenu(true);
我添加了方法来捕捉它的点击:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
Log.w("second fragment","clicked back");
return true;
}
return super.onOptionsItemSelected(item);
}
在活动中我将onCreateOptionsMenu设置为:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
但点击它不会被触发。 我试图添加一个设置按钮,它被触发。 我已经阅读了很多关于此的问题,但我无法弄清楚如何解决它
答案 0 :(得分:0)
setHasOptionsMenu(true)
中调用 onCreate()
,让FragmentManager知道您的片段需要接收选项菜单回调。
答案 1 :(得分:0)
我相信您对ActionBarDrawerToggle
使用this constructor,其中Toolbar
作为参数。如果您使用此构造函数,则单击指示符时将不会调用onOptionsItemSelected
。有关此问题的问题/答案,例如:
AppCompat v7 Toolbar onOptionsItemSelected not called
但是对我来说,它们都没有完美运行,所以我使用了特定于工具栏的构造函数,这里我的案例是解决方法。我在工具栏顶部放置了一个透明视图,只有当我显示后退按钮并且我自己处理点击时才会“看到”(在我的情况下调用onBackPressed()
)。
我知道这是一种黑客攻击,但它需要并为我工作。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_background">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/layoutMainContent"
android:layout_below="@id/appBar"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
<!-- The important view -->
<View
android:id="@+id/viewFakeBack"
android:layout_width="56dp"
android:layout_height="56dp"
android:clickable="true"
android:visibility="gone"/>
</FrameLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/navigation_drawer"/>
</android.support.v4.widget.DrawerLayout>
答案 2 :(得分:-1)
尝试使用switch(...)case语句。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//this will make Hamburger button clickable.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
//this will make the HomeAsUpIndicator button clickable.
switch (item.getItemId()) {
case android.R.id.home:
Log.w("second fragment","clicked back");
break;
}
return super.onOptionsItemSelected(item);
}
希望这会对你有所帮助。