2014-11-14 32 views
8

Tôi gặp sự cố, vì tôi đang phát triển ứng dụng cho kẹo không có support library v7, vì vậy tôi cần sử dụng tiêu chuẩn ActionBar. Trước đây tôi đã sử dụng setHomeButtonEnabled trong nhiều hoạt động với actionBar.Nút trang chủ trong thanh tác vụ không hoạt động trong Lollipop

Khi tôi chuyển sang chủ đề ứng dụng vật liệu tất cả mọi thứ đang làm việc tốt, ngoại trừ phương pháp setHomeButtonEnabled.

Tiêu đề không thể nhấp được.

Trợ giúp!

+0

Bạn đang sử dụng ActionBar hoặc thanh công cụ chuẩn làm thanh tác vụ? – dhuma1981

+0

Standard ActionBar – TommyNecessary

+1

Bạn mong đợi chức năng gì từ nút home? Để làm việc như nút lên hoặc có lẽ một ngăn kéo chuyển đổi? Đăng một số mã và chủ đề mà bạn đang sử dụng. – Simas

Trả lời

17

Đối với một số lý do, một người nào đó tại Google đã quyết định rằng những nên trở thành không-op. Điều này có thể được nhìn thấy dưới đây.

ToolbarWidgetWrapper.java

@Override 
public void setHomeButtonEnabled(boolean enable) { 
    // Ignore 
} 

ToolbarActionBar.java

@Override 
public void setHomeButtonEnabled(boolean enabled) { 
    // If the nav button on a Toolbar is present, it's enabled. No-op. 
} 

Nó có vẻ như mặc dù ToolbarWidgetWrapper được sử dụng để lập bản đồ Toolbar để ActionBar khác biệt đối xử với các Nav Biểu tượng trong thanh công cụ như 'Trang chủ As Up Indicator '. Vì vậy, chỉ có một phần là có thể nhấp. Biểu tượng mới bạn có thể đặt trên Thanh công cụ không bao giờ có thể nhấp được. Họ thậm chí không phơi bày chế độ xem, privatecuộn mắt của nó.

Vì vậy, công việc đầu tiên xung quanh là nếu bạn không sử dụng 'Home Như Up' tính năng hoặc bạn sẵn sàng để kết hợp drawable của bạn lên với drawable nhà của bạn sau đó bạn chỉ có thể thiết lập các thuộc tính trong android:homeAsUpIndicator bạn android:actionBarStyle cùng với android:displayOptions="homeAsUp" .

<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/ActionBar</item> 
</style> 

<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid"> 
    <item name="android:background">@color/action_bar_bg</item> 
    <item name="android:displayOptions">homeAsUp</item> 
    <item name="android:homeAsUpIndicator">@drawable/app_logo</item> 
</style> 

Rõ ràng điều này tương tự có thể được thực hiện với mã.

getActionBar().setHomeAsUpIndicator(R.drawable.app_logo); 
getActionBar().setDisplayHomeAsUpEnabled(true); 

Nhưng điều này có nghĩa là nó sẽ không xuất hiện trong khi hoạt động thực sự đang tải. Vì vậy, tốt nhất để đi với tùy chọn theming.

Các tùy chọn thứ 3 đó sẽ là tốt nhất là chỉ để tạo kiểu cho nút điều hướng cho quan điểm Toolbar mới. Trong đó sử dụng android:navigationButtonStyle nhưng đoán những gì .. họ đã không làm cho một trong những công cộng. Tôi tin rằng đây là một sai lầm geninue nhưng điều này tất cả bắt đầu cảm thấy giống như các vấn đề ban đầu tất cả chúng ta đã có với ActionBar ở nơi đầu tiên.

Vì vậy, hãy giải quyết công việc xung quanh. Ok, hãy thử chỉ thiết lập android:navigationIcon trong android:toolbarStyle. Không. Ok cho phép thử tất cả các biến thể có thể khác mà bạn có thể nghĩ đến bao gồm sử dụng android:actionBarStyleandroid:actionBarTheme. Không. Điều này tôi mong đợi là do navigationIcon đang bị ghi đè một số vị trí trong hành động mặc định của ActionBar/Hoạt động/Thanh công cụ. Tôi không thể làm phiền tôi để xác định vị trí và làm việc một cách xung quanh nó.

Ok, vì vậy cuối cùng, hãy chọn tùy chọn linh hoạt nhất. Thả nút Home mặc định và sử dụng riêng của chúng tôi bằng cách thực hiện các tính năng điều hướng cũ hơn. Điều này có nghĩa là nếu bạn đã sử dụng nav tùy chỉnh, bạn sẽ phải kết hợp nav của bạn với nav này.

giá trị-v21/kiểu.xml

<style name="AppBaseTheme" parent="@android:style/Theme.Material.Light.DarkActionBar"> 
    <item name="android:actionBarStyle">@style/ActionBar</item> 
</style> 

<style name="ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid"> 
    <item name="android:background">@color/action_bar_bg</item> 
    <item name="android:displayOptions">showCustom</item> 
    <item name="android:customNavigationLayout">@layout/nav_layout</item> 
</style> 

layout-v21/nav_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/home" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="start|center_vertical" 
    android:layout_marginEnd="8dp" 
    android:paddingTop="16dp" 
    android:paddingBottom="16dp" 
    android:adjustViewBounds="true" 
    android:background="?android:attr/actionBarItemBackground" 
    android:contentDescription="@string/ab_home_description" 
    android:src="@drawable/app_logo" 
    android:scaleType="fitCenter" 
    /> 

Trong lớp Hoạt động/BaseActivity bạn thêm những điều sau đây. Và điều này sẽ giả nút home.

@Override 
public boolean onPrepareOptionsMenu(final Menu menu) 
{ 
    prepareOptionsMenuLollipop(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void prepareOptionsMenuLollipop(Menu menu) 
{ 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
     final MenuItem homeItem = menu.add(Menu.NONE, android.R.id.home, 
      Menu.NONE, R.string.ab_home_description); 
     homeItem.setVisible(false); 
     View homeView = getActionBar().getCustomView().findViewById(android.R.id.home); 
     homeView.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) 
      { 
       getWindow().getCallback().onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, homeItem); 
      } 
     }); 
    } 
} 
+1

Có thể nếu họ chỉ thêm một vài chủ đề khác và một vài thuộc tính khác với một số giá trị phân giải-thừa kế-phụ thuộc-ngược-phụ thuộc (thiết bị độc lập) có thể sửa chữa nó. Hãy chắc chắn rằng nó '' ẩn' mặc dù! Không muốn để cho các nhà triết học trong! Họ sẽ DEFINITELY mess stuff up. – nmr

+1

chính xác cùng một vấn đề với 'getSupportActionBar() '-' com.android.support:appcompat-v7:23.1.1 ' – kellogs

+0

Đây là những vấn đề tương tự khiến tôi phát điên trên iOS. Hành vi này cũng rất khó kiểm tra trên các phiên bản Android. Điều gì về việc sử dụng DrawerLayout và ActionBarDrawerToggle với phương pháp này? Nó có hoạt động không có thay đổi không? –

Các vấn đề liên quan