Làm cách nào để thực hiện nút quay lại Android ActionBar?


137

Tôi có một hoạt động với một listview. Khi người dùng nhấp vào mục, mục "trình xem" sẽ mở ra:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

Điều này hoạt động tốt, nhưng trên thanh hành động, mũi tên quay lại bên cạnh biểu tượng ứng dụng không được kích hoạt. Tui bỏ lỡ điều gì vậy?


64
getActionBar().setDisplayHomeAsUpEnabled(true);trong onCreate và switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}trong onOptionsItemSelected? cả trong ServicesViewActivity
Selvin

7
Tại sao không phải là một câu trả lời kệ?
KarlKarlsom

Câu trả lời:


263

Selvin đã đăng câu trả lời đúng. Ở đây, giải pháp trong mã đẹp:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

Hàm này NavUtils.navigateUpFromSameTask(this)yêu cầu bạn xác định hoạt động chính trong tệp AndroidManifest.xml

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

Xem ở đây để đọc thêm.


1
Trong tình huống của tôi, tôi đã tìm cách để không gọi onCreate của cha mẹ khi quay lại với nó. Để làm điều này, tôi đã sử dụng triển khai của bạn, nhưng được gọi là finish () thay vì NavUtils.navigateUpFromSameTask (cái này). finish () gọi onStart của tôi thay vì onCreate, điều này lý tưởng hơn đối với tôi.
Jon

Đặt siêu dữ liệu trong tệp kê khai là một chìa khóa để làm cho nút điều hướng hoạt động
VSB

Sử dụng getActionBar().setDisplayHomeAsUpEnabled(true);trong trường hợp bạn đang sử dụng các thư viện hỗ trợ.
Abhinav Upadhyay

Làm thế nào để bạn thay đổi hướng của "lau"? Theo mặc định, việc thực hiện điều hướng quay lại này quét màn hình từ phải sang trái và có vẻ như nó đang tải một màn hình mới. Tuy nhiên, tôi muốn nó xóa từ trái sang phải, giống như nhấn phím quay lại của thiết bị.
cá đuối_

Tôi đã gặp lỗi: Nguyên nhân bởi: java.lang.NullPulumException: Cố gắng gọi phương thức ảo 'void android.app.ActionBar.setDisplayHomeAsUpEnatted (boolean)' trên một tham chiếu đối tượng null
Jones

165

Đảm bảo Nút Home ActionBar của bạn được bật trong Hoạt động:

Android, API 5+:

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

ActionBarSherlock và App-Compat, API 7+:

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

Android, API 11+:

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

Ví dụ MainActivitymở rộng ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

Bằng cách này, tất cả các hoạt động bạn muốn có thể có backpress.

Android, API 16+:

http://developer.android.com/training/imâying-navulation / ancestral.html

AndroidManifest.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.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Ví dụ MainActivitymở rộng ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

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

Nó hoạt động với tôi khi tôi thay đổi getSupportActionBar (). SetDisplayHomeAsUpEnables (true); trong để getActionBar (). setDisplayHomeAsUpEnables (true); và bổ sung những @SuppressLint ( "NewApi") ở onCreate phương pháp bên trong và outsideFor REF: => developer.android.com/training/implementing-navigation/...
gnganpath

1
@ganpath Cẩn thận, sử dụng getActionBar dành cho API 11+ .
Jared Burrows

17

Để bật nút quay lại ActionBar, rõ ràng bạn cần có ActionBar trong Hoạt động của mình. Điều này được thiết lập bởi chủ đề bạn đang sử dụng. Bạn có thể đặt chủ đề cho Hoạt động của mình trong AndroidManfiest.xml. Nếu bạn đang sử dụng ví dụ như @android:style/Theme.NoTitleBarchủ đề, bạn không có ActionBar. Trong trường hợp này, cuộc gọi đến getActionBar()sẽ trả về null. Vì vậy, hãy chắc chắn rằng bạn có ActionBar trước.

Bước tiếp theo là thiết lập android:parentActivityNamehoạt động bạn muốn điều hướng nếu bạn nhấn nút quay lại. Điều này nên được thực hiện trong AndroidManifest.xmlquá.

Bây giờ bạn có thể kích hoạt nút quay lại trong onCreatephương thức hoạt động "con" của mình.

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

Bây giờ bạn nên thực hiện logic cho nút quay lại. Bạn chỉ cần ghi đè onOptionsItemSelectedphương thức trong hoạt động "con" của bạn và kiểm tra id của nút quay lại android.R.id.home.

Bây giờ bạn có thể kích hoạt phương thức NavUtils.navigateUpFromSameTask(this); NHƯNG nếu bạn không chỉ định android:parentActivityNametrong AndroidManifest.xmlđó, điều này sẽ làm hỏng ứng dụng của bạn.

Đôi khi đây là những gì bạn muốn bởi vì nó nhắc nhở bạn rằng bạn đã quên "một cái gì đó". Vì vậy, nếu bạn muốn ngăn chặn điều này, bạn có thể kiểm tra xem hoạt động của bạn có cha mẹ bằng getParentActivityIntent()phương thức này không. Nếu điều này trả về null, bạn không chỉ định cha mẹ.

Trong trường hợp này, bạn có thể kích hoạt onBackPressed()phương thức cơ bản giống như khi người dùng nhấn nút quay lại trên thiết bị. Một triển khai tốt không bao giờ làm hỏng ứng dụng của bạn sẽ là:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Xin lưu ý rằng hình ảnh động mà người dùng nhìn thấy là khác nhau giữa NavUtils.navigateUpFromSameTask(this);onBackPressed().

Tùy thuộc vào con đường bạn đi, nhưng tôi thấy giải pháp hữu ích, đặc biệt nếu bạn sử dụng lớp cơ sở cho tất cả các hoạt động của mình.


10

Tập tin AndroidManifest:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

thêm vào Chi tiết Hoạt động:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

đó là công việc :]


Có vẻ đây là cách dễ nhất đối với tôi. Cảm ơn bạn
TuấnDPH



3

https://stackoverflow.com/a/46903870/4361222

Để đạt được điều này, chỉ cần hai bước,

Bước 1: Truy cập AndroidManifest.xml và trong phần thêm tham số trong thẻ - android: ParentActivityName = ". Home.HomeActivity"

thí dụ :

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Bước 2: trong ActivityDetail thêm hành động của bạn cho trang / hoạt động trước đó

thí dụ :

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

3

Trong phương thức OnCreate, thêm điều này:

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

Sau đó thêm phương thức này:

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

1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

trong onCreatedphương pháp cho apis mới.


1

Nếu bạn đang sử dụng Thanh công cụ, tôi đã gặp phải vấn đề tương tự. Tôi đã giải quyết bằng cách làm theo hai bước sau

  1. Trong AndroidManifest.xml
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. Trong SecondActivity, thêm những ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

Các bước sau là đủ để quay lại nút:

Bước 1: Mã này phải có trong Manifest.xml

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

Bước 2: Bạn sẽ không cho

finish();

trong Hoạt động phụ huynh của bạn trong khi bắt đầu Hoạt động trẻ em.

Bước 3: Nếu bạn cần quay lại Hoạt động của phụ huynh từ Hoạt động trẻ em, thì bạn chỉ cần cung cấp mã này cho Hoạt động trẻ em.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));

0

Dựa trên câu trả lời của Jared, tôi đã phải kích hoạt và thực hiện hành vi nút quay lại của thanh hành động trong một số hoạt động và tạo lớp trợ giúp này để giảm trùng lặp mã.

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

Sử dụng trong một hoạt động:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    ActionBarHelper.enableBackButton(this);
}
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.