Android - Nút quay lại trên thanh tiêu đề


110

Trong nhiều ứng dụng (Lịch, Drive, Cửa hàng Play) khi bạn nhấn vào một nút và nhập hoạt động mới, biểu tượng trên thanh tiêu đề sẽ biến thành nút quay lại, nhưng đối với ứng dụng tôi đang tạo, nó không làm được điều đó. Làm cách nào để đặt biểu tượng đó đưa bạn trở lại màn hình trước đó?


Hãy thử getSupportActionBar () trong ví dụ OnCreate tại đây freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Câu trả lời:


145

Có hai bước đơn giản để tạo nút quay lại trên thanh tiêu đề:

Đầu tiên, làm cho biểu tượng ứng dụng có thể nhấp được bằng cách sử dụng mã sau trong hoạt động có thanh tiêu đề mà bạn muốn có nút quay lại:

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

Sau khi đã thêm đoạn mã trên, bạn sẽ thấy xuất hiện mũi tên quay lại bên trái biểu tượng ứng dụng.

nhập mô tả hình ảnh ở đây

Thứ hai, sau khi bạn đã thực hiện các bước trên, bạn vẫn phải tạo mã để tận dụng sự kiện nhấp chuột. Để làm như vậy, hãy lưu ý rằng, khi bạn thực sự nhấp vào biểu tượng ứng dụng, một onOptionsItemSelectedphương thức sẽ được gọi. Vì vậy, để quay lại hoạt động trước đó, hãy thêm phương thức đó vào hoạt động của bạn và đặt Intentmã vào đó sẽ đưa bạn trở lại hoạt động trước đó. Ví dụ: giả sử hoạt động bạn đang cố gắng quay lại được gọi MyActivity. Để quay lại nó, hãy viết phương thức như sau:

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

Đó là nó!

(Trong API dành cho nhà phát triển Android, nó khuyên bạn nên làm rối với tệp kê khai và thêm những thứ như thế android:parentActivityName. Nhưng điều đó dường như không hiệu quả với tôi. Ở trên đơn giản hơn và đáng tin cậy hơn.)

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

Và trong Hoạt động của bạn

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
Bạn đã giải thích rõ nhưng nếu onOptionItemSelected của bạn không sai, bạn chỉ nên gọi finish (); trong trường hợp của bạn startActivityForResult sẽ khởi động hoạt động thứ hai và khi bạn sẽ nhấn trở lại từ hoạt động thứ hai bạn sẽ được ném trở lại hoạt động đầu tiên (nơi biểu tượng yo ép thanh hành động)
Yahya Arshad

8
Hơn nữa, bạn chỉ nên làm điều đó nếu item.getItemId () là android.R.id.home
cắnk

2
Như AS khẳng định: "Phương pháp gọi 'actionBar.setDisplayHomeAsUpEnabled (true) có thể sản xuất java.lang.NullPointerException"
statosdotcom

1
Cảnh báo! Với một actionBar ToolBar trả về giá trị null với sự cố. Xem câu trả lời bên dưới.
CoolMind

5
getActionBar () không hoạt động với tôi, ứng dụng chỉ bị treo. getSupportActionBar () đã hoạt động.
john ktejik

60

sử dụng mã này

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

sau đó viết mã này trong onOptionsItemSelectedphương thức

  int id = item.getItemId();

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

1
getActionBar()cho tôi một null; bạn có biết tại sao?
msysmilu

3
bởi vì không có ActionBar, ví dụ: với style <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item>
Paul Verest

46

Cuối cùng tôi đã quản lý để thêm đúng nút quay lại vào thanh tác vụ / thanh công cụ

@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;
}

3
Đây là câu trả lời duy nhất phù hợp với tôi. Cảm ơn bạn @LucyFair
Arda Çebi

2
Tương tự. Cảm ơn bạn vì câu trả lời.
Maria

Tương tự. Không có câu trả lời nào khác hoạt động. Đây phải là câu trả lời được chấp nhận.
El Sushiboi

18

1.- Thêm hoạt động vào AndroidManifest.xml và đảm bảo cung cấp siêu dữ liệu:

<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.- Thêm mã sau vào phương thức onCreate của hoạt động:

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

3.- Ghi đè onOptionsItemSelected và sử dụng phương thức tĩnh NavUtils.navigateUpFromSameTask () để điều hướng ném ngăn xếp.

@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);
}

Tuy nhiên, việc sử dụng NavigateUpFromSameTask () chỉ phù hợp khi ứng dụng của bạn là chủ sở hữu của tác vụ hiện tại (nghĩa là người dùng đã bắt đầu tác vụ này từ ứng dụng của bạn). Nếu điều đó không đúng và hoạt động của bạn đã được bắt đầu trong một nhiệm vụ thuộc một ứng dụng khác, thì điều hướng Lên sẽ tạo một tác vụ mới thuộc về ứng dụng của bạn, điều này yêu cầu bạn tạo một ngăn xếp mới.


Cảm ơn bạn đã giới thiệu NavUtils!
AntonSack

10

Nếu hoạt động của bạn kéo dài Hoạt động

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Nếu hành động của bạn mở rộng AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Không cần làm nữa, hãy xem Thêm hành động

[TÙY CHỌN] Để xác định rõ ràng hoạt động gốc, hãy sửa đổi Manifest.xml của bạn như sau:

<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>

Xem Chỉ định hoạt động của cha mẹ


1
Đây chính là những gì tôi đang tìm kiếm. Bạn đã cứu ngày của tôi. Cảm ơn rất nhiều.
Tashi Dendup

6

Nếu hoạt động của bạn kéo dài, AppCompatActivitybạn cần ghi đè onSupportNavigateUp()phương thức như sau:

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;
   }
}

Xử lý logic của bạn trong onBackPressed()phương pháp của bạn và chỉ cần gọi phương thức onSupportNavigateUp()đó để nút quay lại trên điện thoại và mũi tên trên thanh công cụ làm điều tương tự.


6

trước hết trong Hàm onCreate, hãy thêm dòng sau

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

và sau đó thêm chức năng sau vào mã:

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

        return super.onOptionsItemSelected(item);
    }

6

Đầu tiên bạn cần viết mã này

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

Sau đó thêm dòng này vào tệp kê khai

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

Tôi nghĩ nó sẽ hoạt động


5

Nếu bạn đang sử dụng thư viện hỗ trợ mới cho 5.1 trong android studio, thay vào đó bạn có thể sử dụng thư viện này trên AppCompatActivity của mình

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

hoan hô.


5

Cách đơn giản nhất và phương pháp hay nhất như google giải thích ở đây :

1.Thêm cha mẹ cho con bạn Hoạt động trong AndroidManifest.xml:

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

2. Kích hoạt nút quay lại trong con bạn Hoạt động:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Làm việc cho tôi, tôi hy vọng nó cũng hiệu quả cho bạn.


điều này chỉ hợp lệ nếu hoạt động chỉ có thể có một hoạt động mẹ. Đó là trường hợp của tôi. +1
MQoder

Bước 2 không bắt buộc trong trường hợp của tôi.
Thomio

5

Sau một thời gian chất lượng tôi đã tìm thấy, tùy chọn chủ đề là vấn đề chính trong mã của tôi Và sau đây là cách thích hợp để hiển thị thanh công cụ cho tôi

Trong tệp AndroidManifest trước tiên, bạn phải thay đổi kiểu chủ đề của mình

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

thì tại xml hoạt động của bạn, bạn cần gọi Thanh công cụ của riêng mình như

<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"/>

Và sau đó thanh công cụ này sẽ được gọi trong tệp Java của bạn bằng cách

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

Và đối với thanh công cụ hiển thị U nên kiểm tra null để tránh NullPointerException

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

Đối với hoạt động tại nhà trở lại, hãy thêm cái này

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

        return super.onOptionsItemSelected(item);
    }

HOẶC cho hoạt động mong muốn của bạn trở lại

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

3

Tôi đã thấy rất nhiều câu trả lời phức tạp, vì vậy đây là mã của tôi. Làm việc ở đây. Bạn có thể đạt được điều này bằng hai cách.

1) Khả năng tương thích Android Stardard

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) Sử dụng biểu tượng tùy chỉnh

Nếu bạn muốn sử dụng mã trong nhận xét, bạn chỉ cần thêm tệp này trong tệp có thể vẽ, được gọi là 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>

Với mã này.

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

Hy vọng nó sẽ giúp một số người ở đây!


2

Phiên bản trọng lượng nhẹ mà không cần sử dụng ActionBarActivityvẫn có bahaviors tương tự ở đây:

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);
    }
}

Cách sử dụng: Đặt new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);vào onCreate.


Điều này phù hợp với tiện ích con Thanh công cụ mới có trong thư viện hỗ trợ. Cảm ơn!!
Clocker

2

Bạn cần thêm mã được đề cập bên dưới vào tệp kê khai. Tìm kiếm hoạt động mà bạn muốn thêm chức năng mũi tên quay lại. Nếu bạn tìm thấy một cái thì tốt hoặc tạo hoạt động

<activity android:name=".SearchActivity">

</activity>

Sau đó, thêm ba dòng mã sau vào giữa.

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

Và đừng quên thêm đoạn mã này vào onCreate (); phương pháp hoạt động cụ thể của bạn mà bạn cần mũi tên quay lại.

        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");
    }

Đây là cách tôi giải quyết vấn đề. Cảm ơn.


2

Các câu trả lời khác không đề cập rằng bạn cũng có thể đặt điều này trong XML của Toolbartiện ích con của bạn :

app:navigationIcon="?attr/homeAsUpIndicator"

Ví dụ:

<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" />

2

Tất cả những gì bạn cần làm vào năm 2020:
(xem xét bạn muốn quay lại 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;
}

Điều đó thật thú vị, nhưng bạn đang giả định rằng chúng tôi muốn quay lại MainActivity. Làm thế nào bạn sẽ chuyển hướng đến bất kỳ hoạt động trước đó?
mayid


1

Nó cũng có thể được thực hiện mà không cần mã bằng cách chỉ định hoạt động chính trong tệp kê khai ứng dụng Nếu bạn muốn nút quay lại trong Hoạt động B sẽ chuyển đến Hoạt động A, chỉ cần thêm Hoạt động A làm cha của Hoạt động B trong tệp kê khai.


1

Đối với kotlin:

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

1

Tôi cần kết hợp một số câu trả lời để có câu trả lời phù hợp cho mình vì ứng dụng của tôi có 3 hoạt động có thể quay đi quay lại bất kỳ lúc nào. Hoạt động1> Hoạt động2> Hoạt động3. Khi tôi đang làm điều gì đó trên Activity3 của mình, nút quay lại đã sao lưu chính xác vào Activity2. Tuy nhiên, từ Activity2, bằng cách sử dụng finish(), nó đã trở lại Activity3 chứ không phải Activity1. Và tôi đang mở rộng AppCompatActivity. Vì vậy, giải pháp của tôi là:

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

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

trên 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>

và cuối cùng, nút hành động trên menu của tôi (thanh tác vụ):

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

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

        }

        return super.onOptionsItemSelected(item);

    }

Sử dụng NavUtils.navigateUpFromSameTask(this);làm việc cho tôi, thay vì finish().


1

Chỉ chia sẻ điều gì đó đã giúp tôi và có thể hữu ích cho người khác. Mặc dù hầu hết các câu trả lời ở đây đều đúng, nhưng bằng cách sử dụng getActionBar().setDisplayHomeAsUpEnabled(true);, điều này không hiệu quả với tôi. Vấn đề tôi gặp phải là tôi đang cố gắng tạo Hoạt động thứ hai theo cách thủ công, nhưng có nhiều chi tiết hơn liên quan.
Điều thực sự giải quyết được vấn đề của tôi là làm theo hướng dẫn dành cho Nhà phát triển Android ( https://developer.android.com/training/basics/firstapp/starting-activity ) để tạo Hoạt động thứ hai bằng các công cụ của riêng 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.

0

Bạn cũng có thể chỉ cần đưa onBackPressed()vào trình nghe onClick của mình. Điều này khiến nút của bạn hoạt động giống như các nút "quay lại / lên" mặc định trong ứng dụng Android!


0
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);
}

0

Điều này đang hoạt động đối với tôi .. Giả sử có hai hoạt động (Activityone, Activitytwo)

Bên trong Activitytwo sử dụng mã này

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

Trên Activityone

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

Điều này sẽ được bao gồm trong hoạt động thứ hai bên trong tệp kê khai

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

Và kết quả sẽ như thế này

nhập mô tả hình ảnh ở đây


0
  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;
    }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.