Thanh tác vụ Android không hiển thị phần tràn


90

Tôi có một thanh tác vụ trong ứng dụng của mình với 3 mục.

Chỉ có 2 có thể được hiển thị do các vấn đề về không gian, vì vậy tôi mong đợi cái đầu tiên được hiển thị và phần còn lại sẽ được hiển thị trong phần tràn. Tuy nhiên trong thực tế, chỉ có 2 mục đầu tiên được hiển thị và không có phần tràn nào có thể phát hiện được.

Đây là mã có liên quan: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
Nếu thiết bị của bạn có nút menu, biểu tượng mục bổ sung sẽ không hiển thị. Bạn đang sử dụng thiết bị nào?
Reinier

1
thiết bị ảo mà tôi đang thử nghiệm thực sự có một nút menu, nhấp vào nó và mục bị thiếu xuất hiện, cảm ơn!
Mats Raemen

2
@Reinier Tôi đang sử dụng ActionBarSherlock. Trên Galaxy Ace chạy 2.3 nó được hiển thị, trên Galaxy SII chạy 4.0 nó không được hiển thị. Cả hai đều có nút menu HW.
Mister Smith,

2
Tôi muốn xác nhận rằng điều này đã khiến tôi bối rối rằng tôi có biểu tượng tràn trên máy mua nexus 7 không phải trên Galaxy Note II. Note có một nút menu. Cảm ơn!
bsautner

@Reinier vui lòng giúp tôi gặp vấn đề tương tự, tôi nên làm gì?
rupesh

Câu trả lời:


125

Nếu bạn muốn hiển thị ba dấu chấm, bất kể nút menu của thiết bị! thì bạn có thể gọi phương thức này trong lớp ứng dụng của mình 'phương thức onCreate-

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
Đây là một vụ hack khủng khiếp phá vỡ tính nhất quán với các ứng dụng còn lại trên nền tảng. Đừng làm điều này.
adamp

19
Điều này có vẻ như là ít hơn của hai tệ nạn. Hành vi hiện tại là không thể chấp nhận được.
biorbnA

6
Đó là một cách tuyệt vời để cho phép có tràn, phím cứng menu sẽ không còn được dung thứ nữa.
Necronet

5
Nó hoạt động tuyệt vời! Hoạt động ngay cả khi người dùng nhấn nút menu phần cứng (thật rực rỡ), mặc dù bạn sẽ nghe thấy hiệu ứng âm thanh menu hai lần .. có ai biết cách làm cho nó chỉ phát ra âm thanh một lần không?
Bruce

5
ĐÂY KHÔNG PHẢI LÀ HACK. Các nhà phát triển cần biết những gì được gọi là hack vì nó không phải là 2 + 2 trong Android. Reflection đang tiết kiệm thời gian bằng cách sử dụng các cơ chế Java, nếu không, bạn sẽ chuyển ngữ cảnh cho các lớp bên trong của mình 24/7 hoặc tùy chỉnh AOSP đến vô tận. Đối với tôi, giải pháp này giải quyết vấn đề phải ghi đè và bao gồm hàng tấn nội dung tùy chỉnh AOSP VÀ các hiệp hội riêng tư được liên kết chỉ vì lợi ích của những gì những người theo chủ nghĩa thuần túy coi là sạch. Bạn có biết rằng bạn không thể buộc bật FASTSCROLL một cách nhất quán cho các danh sách nhỏ? Trước khi tôi sử dụng phản chiếu, điều này yêu cầu tôi sao chép hơn 10 tài nguyên AOSP, để chỉnh sửa MỘT ký tự.
leRobot

54

Thanh tác vụ

res / menu / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

Tải xuống Bộ biểu tượng thanh tác vụ


2
Hãy xem bình luận của @Reinier, đúng là "Nếu thiết bị của bạn có nút menu, biểu tượng tràn sẽ không hiển thị".
Ahmad Dwaik 'Warlock'

Tôi kiểm tra trong thiết bị có nút menu và phần tràn đang hiển thị trong trường hợp của tôi. Tôi sử dụng android:showAsAction="always"cho mặt hàng hơn
Kirit Vaghela

bạn đã kiểm tra nó trên thiết bị nào? Tôi đã sử dụng một xperia neo v và s #
Ahmad Dwaik 'Warlock'

1
Lưu ý: mục của bạn mà thổi phồng tràn đơn PHẢI showAsAction của bạn = "always"
Kirit Vaghela

1
showAsAction không khả dụng trong không gian tên android trong các SDK cũ hơn. Theo liên kết này developer.android.com/training/basics/actionbar/… để khắc phục điều này. Sau khi thêm NS schemas.android.com/apk/res-auto , thủ thuật trên hoạt động hoàn toàn tốt đối với tôi
chedine Ngày

42

Tôi nhận thấy đây không phải là một menu tràn, nhưng nó tương tự. Được rồi, điều này đơn giản nhưng rất khó để tìm ra.

Trước tiên, bạn cần một mục menu mà bạn muốn sử dụng làm bộ bơm tràn. Thí dụ

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

Sau khi bạn có mục của mình, hãy thêm menu phụ chứa các mục bạn muốn trong menu mục bổ sung. Thí dụ:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

Khi nhấp vào điều này sẽ làm phồng các mục khác bên trong. Ứng dụng của tôi đang sử dụng ActionBarSherlock 4.0 nên trước khi ứng dụng này hoạt động với bạn, bạn cần truy cập vào "SplitActionBar". (Sẽ vẫn hoạt động trên Thanh tác vụ android mặc định)

Đây là cách thực hiện: Trong tệp AndroidManifest.xml của bạn, bạn cần thêm mã này trong hoạt động mà bạn cần menu mục bổ sung.

android:uiOptions="splitActionBarWhenNarrow"

LƯU Ý: Mục làm phồng menu mục bổ sung của bạn PHẢIshowAsAction="always"

Vwola! bạn có một menu mục bổ sung! Hy vọng tôi đã giúp bạn ra ngoài. :)


3
Giải pháp tuyệt vời, tốt hơn so với hack nút menu.
ol0

26

Trên các thiết bị có nút menu phần cứng (Galaxy S3, cứng đầu như Samsung ...), menu mục bổ sung hoạt động như menu 'truyền thống', bằng cách sử dụng nút menu phần cứng.


2
Câu trả lời cũ, tuy nhiên với thư viện khả năng tương thích chỉ tình cờ gặp kết quả rất kỳ lạ: 3 thiết bị có nút phần cứng, Note 3 Neo = Menu tràn được hiển thị, nút menu không hoạt động, Note 1 = Không tràn, nút menu hoạt động, Galaxy S3, không tràn, nút menu không hoạt động! Điều này là điên.
3c71

5

Khi bạn nói menu "mục bổ sung", có phải ý bạn là ba dấu chấm hiển thị ở cuối để cho biết rằng có nhiều mục hơn .... hay ý của bạn là thanh tác vụ phân tách hiển thị ở dưới cùng dành cho mục mục bổ sung?

Nếu ý bạn là thanh tác vụ phân tách, bạn nên thêm thanh này vào tệp kê khai hoạt động của mình

android:uiOptions="splitActionBarWhenNarrow"

Theo mặc định, menu mục bổ sung ba chấm sẽ tự động xảy ra, do đó, thật khó để biết vấn đề là gì từ thông tin bạn cung cấp ở trên.


Ý tôi là dấu ba chấm. Nó không phải như đó là vì các mục, bởi vì bất cứ khi nào thay đổi mặt hàng trật tự, đó là 2 biểu tượng đầu tiên được hiển thị
Mats Raemen

Tôi có nên cung cấp thêm thông tin để có thể xác định vấn đề thực tế không?
Mats Raemen

MinSdkVersion, targetSdkVersion của bạn và phiên bản bạn đang thử nghiệm là gì?
Sparky

5
Thiết bị của bạn có các nút vật lý cho menu hay chúng là các nút ảo giống như điện thoại galaxy nexus? Tôi nghĩ rằng ba chấm sẽ chỉ hiển thị nếu điện thoại của bạn không có các nút vật lý.
wnafee

5

Để luôn hiển thị tràn hành động (ba chấm) trên actionbarcompat:
trong tệp menu, ví dụ:
main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

và trong tệp hoạt động:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

Nó hoạt động tốt cho tôi.
Đã thử nghiệm trên Google Nexus S, Samsung S3.


3

Có vẻ như trên các thiết bị có nút menu, menu mục bổ sung không hiển thị trong Thanh hành động. Ngoài ra, chúng tôi không có cách nào để biết liệu thiết bị có nút menu phần cứng trước API cấp 14 (4.0+) hay không.

Giải pháp này thêm một nút tràn vào một android.support.v7.app.ActionBarđể mở menu tùy chọn tiêu chuẩn chỉ trên pre-Honeycomb (<3.0), nếu không, hãy để nó cho hệ thống. Trong mọi trường hợp, bạn có thể chọn giữa alwayshoặc ifRoomcho tất cả các hành động.

Nhận biểu tượng tràn từ Gói biểu tượng thanh hành động .

Thêm menu (tôi chọn một số phần không liên quan như tiêu đề, thứ tự, v.v.)

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

Xóa tác vụ tràn của chúng tôi trên 3.0+

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

Cuối cùng gọi Activity.openOptionsMenu()từ hành động tràn.

Ơ ... không. Bạn không thể không gọiopenOptionsMenu() từ một nút menu ... nhưng nếu bạn đang sử dụng AndroidAnnotations, bạn sẽ thực hiện dễ dàng:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

Nếu không bạn nên làm điều gì đó như thế này, tôi cho rằng

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}

2

Hãy thử thay đổi chủ đề của ứng dụng từ Theme.AppCompat.Light.DarkActionBar thành Theme.AppCompat.Light


2

Đặt xmlns:your_app_name="http://schemas.android.com/apk/res-auto"thẻ menu bên trong và thay vào đóandroid:showAsAction="always" sử dụngyour_app_name:showAsAction="always"

ví dụ

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

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.