簡體   English   中英

Android - 標題欄中的后退按鈕

[英]Android - Back button in the title bar

在許多應用程序(日歷、雲端硬盤、Play Store)中,當您點擊按鈕並輸入新活動時,標題欄中的圖標會變成后退按鈕,但對於我正在制作的應用程序,它不會這樣做。 如何使該圖標帶您回到上一個屏幕?

在標題欄中創建后退按鈕有兩個簡單的步驟:

首先,在您希望在其標題欄中添加后退按鈕的 Activity 中使用以下代碼使應用程序圖標可點擊:

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

添加上述代碼后,您將看到應用程序圖標左側出現一個后退箭頭。

在此處輸入圖像描述

其次,在完成上述操作后,您仍然需要創建能夠利用點擊事件的代碼。 為此,請注意,當您實際單擊應用程序圖標時,會調用onOptionsItemSelected方法。 因此,要返回上一個活動,請將該方法添加到您的活動中,並將Intent代碼放入其中,這將使您返回上一個活動。 例如,假設您嘗試返回的活動稱為MyActivity 要回到它,編寫方法如下:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

而已!

(在 Android 開發人員 API 中,它建議搞亂清單並添加類似android:parentActivityName的東西。但這似乎對我不起作用。上面更簡單,更可靠。)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />

在你的活動中

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

使用此代碼

 @Override
 public void onCreate(Bundle savedInstanceState) {
    ...
   getActionBar().setDisplayHomeAsUpEnabled(true);
 } 

之后在onOptionsItemSelected方法中編寫此代碼

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

我終於設法將后退按鈕正確添加到操作欄/工具欄

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}  

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}

1.- 將活動添加到 AndroidManifest.xml 並確保提供元數據:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myfirstapp.MainActivity" />
</activity>

2.- 將以下代碼添加到活動的 onCreate 方法中:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
} 

3.- 覆蓋 onOptionsItemSelected 並使用 NavUtils.navigateUpFromSameTask() 靜態方法來導航拋出堆棧。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

但是,僅當您的應用程序是當前任務的所有者(即用戶從您的應用程序開始此任務)時,才適合使用 navigateUpFromSameTask()。 如果不是這樣,並且您的活動是在屬於不同應用程序的任務中啟動的,那么向上導航應該會創建一個屬於您的應用程序的新任務,這需要您創建一個新的后退堆棧。

如果您的活動確實擴展了活動

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

如果您的操作擴展了 AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

無事可做,請參閱添加操作

[可選] 要顯式定義父活動,請修改您的 Manifest.xml,如下所示:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.YourActivity "
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

請參閱指定父活動

首先,您需要編寫此代碼

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

然后在清單中添加這一行

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

我認為它會起作用

首先在 onCreate 函數中添加以下行

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

然后在代碼中添加以下函數:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

如果您的活動擴展了AppCompatActivity ,您需要像這樣覆蓋onSupportNavigateUp()方法:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

   @Override
   public boolean onSupportNavigateUp() {
       onBackPressed();
       return true;
   }
}

onBackPressed()方法中處理您的邏輯,然后在onSupportNavigateUp() () 中調用該方法,以便手機上的后退按鈕和工具欄上的箭頭執行相同的操作。

經過一段時間我發現,主題選項是我代碼中的主要問題以下是為我顯示工具欄的正確方法

在 AndroidManifest 文件中,首先你必須改變你的主題風格

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

然后在您的活動 xml 中,您需要調用自己的工具欄,例如

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>

然后這個工具欄應該在你的Java文件中被調用

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

對於顯示 U 的工具欄,應檢查 null 以避免 NullPointerException

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

對於家庭活動回來添加這個

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId()==android.R.id.home) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

或返回您想要的活動

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }

如果您在 android studio 中使用 5.1 的新支持庫,則可以在 AppCompatActivity 上使用它

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

干杯。

谷歌在這里解釋的最簡單的方法和最佳實踐:

1.在AndroidManifest.xml中為您的 childActivity 添加父級:

<activity 
        android:name=".ChildActivity"
        android:parentActivityName=".ParentActivity" >
</activity>

2.在您的 childActivity 中激活后退按鈕:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

為我工作,我希望它也適合你。

我看到了很多復雜的答案,所以這是我的代碼。 在這里工作。 您可以通過兩種方式實現這一目標。

1) 標准安卓兼容性

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}

2)使用自定義圖標

如果你想在注釋中使用代碼,你只需要在drawable中添加這個文件,叫做ic_arrow_white_24dp.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>

有了這個代碼。

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });

希望它會幫助這里的一些人!

2020年你需要做的一切:
(考慮到你想返回MainActivity)

protected void onCreate(Bundle savedInstanceState){
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public boolean onOptionsItemSelected(MenuItem item) {
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

不使用ActionBarActivity的輕量級版本仍然具有相同的行為:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

用法:Put new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true); onCreate

您需要在清單文件中添加下面提到的代碼。 搜索要在其中添加后退箭頭功能的活動。 如果你找到了那很好或創建活動

<activity android:name=".SearchActivity">

</activity>

然后在其間添加以下三行代碼。

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />

並且不要忘記在 onCreate() 中添加這段代碼; 您需要返回箭頭的特定活動的方法。

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

這就是我解決問題的方法。 謝謝。

對於科特林:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }

我需要混合一些答案來為我找到正確的答案,因為我的應用程序有 3 個可以隨時來回的活動。 活動 1 > 活動 2 > 活動 3。 當我在我的活動 3 上做某事時,后退按鈕正確返回到活動 2。 但是,從 Activity2 開始,使用finish() ,它返回到 Activity3 而不是 Activity1。 我正在擴展 AppCompatActivity。 所以,我的解決方案是:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

在 AndroidManifest.xml 上:

<activity android:name=".activities.Activity2"
           android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.appname.activities.Activity1" />
        </activity>

最后,我的菜單上的操作按鈕(操作欄):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

使用NavUtils.navigateUpFromSameTask(this); 為我工作,而不是finish()

其他答案沒有提到您也可以在Toolbar小部件的 XML 中設置它:

app:navigationIcon="?attr/homeAsUpIndicator"

例如:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />

只是分享一些對我有幫助並且可能對其他人有用的東西。 雖然這里的大多數答案都是正確的,但通過使用getActionBar().setDisplayHomeAsUpEnabled(true); ,這對我不起作用。 我遇到的問題是我試圖手動創建第二個活動,但涉及更多細節。
真正解決我的問題的是遵循 Android 開發者教程 ( https://developer.android.com/training/basics/firstapp/starting-activity ) 使用 Android Studio 自己的工具創建第二個活動:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.

如果您使用的是 ActionBar,您需要閱讀本文檔http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

然后你必須覆蓋方法 onOptionsItemSelected(MenuItem) 並尋找 android.R.id.home 事件進來。然后你知道用戶點擊了操作欄上的返回按鈕

它也可以通過在應用程序清單中指定父活動而無需代碼來完成如果您想要 Activity B 中的后退按鈕將轉到 Activity A,只需在清單中添加 Activity A 作為 Activity B 的父級。

您也可以簡單地將onBackPressed()放在 onClick 偵聽器中。 這會導致您的按鈕像 Android 應用程序中的默認“后退/向上”按鈕一樣!

Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
    finish();
return super.onOptionsItemSelected(item);
}

這對我有用..假設有兩個活動(Activityone,Activitytwo)

在Activitytwo里面使用這個代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

在活動一

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

這應該包含在清單文件中的第二個活動中

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

結果會是這樣

在此處輸入圖像描述

這對我有用 getSupportActionBar().setDisplayHomeAsUpEnabled(false); 在此處輸入圖像描述

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 為我工作。謝謝你,明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM