如何在ActionBar中设置返回按钮?

3

我在代码中遇到了问题,无法在操作栏中设置返回按钮。 我在AndroidManifest中指定AProposActivity是MainActivity的子活动,但出现了java.lang.NullPointerException。 以下是我的Java代码:

 public class AProposActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_apropos);

    getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
}
}

还有我的XML文件:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.emi.integre.projet.dentistterms.AProposActivity">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/apropos1"
    android:id="@+id/textView3"
    android:layout_above="@+id/textView4"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="42dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/apropos2"
    android:id="@+id/textView4"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/name1"
    android:id="@+id/textView5"
    android:layout_below="@+id/textView4"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginRight="24dp"
    android:layout_marginLeft="24dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/name2"
    android:id="@+id/textView6"
    android:layout_below="@+id/textView5"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginRight="24dp"
    android:layout_marginLeft="24dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/name3"
    android:id="@+id/textView7"
    android:layout_below="@+id/textView6"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginRight="24dp"
    android:layout_marginLeft="24dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/name4"
    android:id="@+id/textView8"
    android:layout_below="@+id/textView7"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginRight="24dp"
    android:layout_marginLeft="24dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/apropos4"
    android:id="@+id/textView9"
    android:layout_marginBottom="56dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginRight="12dp"
    android:layout_marginLeft="12dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/apropos3"
    android:id="@+id/textView11"
    android:layout_above="@+id/textView10"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/name5"
    android:id="@+id/textView10"
    android:layout_above="@+id/textView9"
    android:layout_alignLeft="@+id/textView8"
    android:layout_alignStart="@+id/textView8" />

这里还有我的AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.emi.integre.projet.dentistterms">

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".AcceuilActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ResultActivity"
        android:label="Voici le terme dans les 3 langues"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.emi.integre.projet.dentistterms.MainActivity" />
    </activity>
    <activity
        android:name=".SearchActivity"
        android:label="Rechercher un terme"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.emi.integre.projet.dentistterms.MainActivity" />
    </activity>

    <activity android:name=".AProposActivity" android:label="A Propos"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.emi.integre.projet.dentistterms.MainActivity"/>
    </activity>

</application>

这是我的styles.xml文件内容:

<resources xmlns:tools="http://schemas.android.com/tools">


<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:colorBackground">@color/background_material_light</item>
    <item name="android:textColorPrimary">@android:color/black</item>
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    <item name="android:windowTranslucentStatus" tools:targetApi="21">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:navigationBarColor" tools:targetApi="21">@color/navigationBarColor
    </item>
    <item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="21">true</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@color/drawerArrowColor</item>
</style>

4个回答

1
当你在AndroidManifest.xml中为你的应用设置android:theme="@style/AppTheme.NoActionBar"时,ActionBar将不会被充气。你可以使用ToolBar,在你的布局中声明它并调用它。
 setSupportActionBar((ToolBar) findViewById(R.id.toolBar)); 

在调用任何getSupportActionBar()函数之前,或者更改具有ActionBar支持的主题。

你在哪里修改它的?在活动标签中吗?在应用程序标签中吗?还是在styles.xml中? - Blackbelt
@style/AppTheme的父级是什么? - Blackbelt
我相信问题出在我的styles.xml文件中:<style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> - BENSEGHIR Mohamed Amine
"不工作" 是什么意思?应用崩溃了吗?可以分享更多信息吗? - Blackbelt
空指针异常: 尝试在 null 对象引用上调用 'void android.support.v7.app.ActionBar.setDefaultDisplayHomeAsUpEnabled' 方法 - BENSEGHIR Mohamed Amine
显示剩余9条评论

0

试试这个

public void enableActionBarHomeButton(AppCompatActivity appCompatActivity){
    android.support.v7.app.ActionBar mActionBar = appCompatActivity.getSupportActionBar();
    mActionBar.setHomeButtonEnabled(true);
    mActionBar.setDisplayHomeAsUpEnabled(true);
}

然后执行如下函数调用。
enableActionBarHomeButton(this);

0

步骤1:创建一个名为toolbar_layoutxml文件,其中包含toolbar

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

步骤2:您需要在活动布局中添加上述工具栏,可以通过以下方式进行:

<LinearLayout
  android:id="@+id/container_toolbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical">

 <include
  android:id="@+id/toolbar"
  layout="@layout/toolbar" />
</LinearLayout>

步骤3:按照以下方式更改您的onCreate()方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_apropos);

    ToolBar toolbar = (ToolBar) findViewById(R.id.toolBar)
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    //your code here
}
步骤4:onOptionsItemSelected()中按以下方式检查id:
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(id == android.R.id.home){
            //onBackPressed();  //you can call this directly 
                      //OR
            //your code implementation if any 
        }
        return super.onOptionsItemSelected(item);
    }

我在你的代码中遇到了这个问题:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference。 - BENSEGHIR Mohamed Amine
Toolbar.getTitle() 我的代码中没有这样做。 - Pankaj
我也是!问题仍然存在。 - BENSEGHIR Mohamed Amine

0

如果您正在使用默认的ActionBar,请使用以下代码:

ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

在 onOptionItemSelected(MenuItem item) 方法中添加以下代码行。
case android.R.id.Home :
       this.finish();
       return true;

请导入android.support.v7.app.ActionBar而不是android.app.ActionBar。 - Shivam Satija

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接