2013-06-05 15 views
11

Tôi muốn tạo ra một mục trình đơn tràn tùy chỉnh trong ActionBar tôi ngoài tại mục Setting như được mô tả trong hình dưới đây:Android tạo tùy chỉnh menu tràn

Action bar

Nhưng nếu có vài không gian trong ActionBar Tôi không muốn Item1 và Item2 đi vào mục Setting như tràn, nhưng vào "mục tràn của tôi".

đây là thực đơn đang xml của tôi:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom|withText" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom|withText" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="always" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="never" 
    android:title="@string/action_settings"/></menu> 

Trả lời

6

Điều này sẽ giúp bạn. Tôi đã được mã hóa này cho menu tràn

Trong menu/main.xml nộp

<item 
    android:id="@+id/overflow" 
    android:orderInCategory="100" 
    android:showAsAction="always" 
    android:icon="@drawable/ic_overflow" 
    android:title=""> 
    <menu> 
     <item 
      android:id="@+id/facebook" 
      android:title="Facebook"/> 

     <item 
      android:id="@+id/Twitter" 
      android:title="Twitter"/> 

     <item 
      android:id="@+id/Youtube" 
      android:title="Youtube"/> 
    </menu> 
</item> 

Và đây là mã java của bạn:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 

    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    // Handle action bar actions click 

    super.onOptionsItemSelected(item); 
    if(item.getItemId() == R.id.facebook){ 
     Toast.makeText(Getstarted.this, "Option pressed= facebook",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Youtube){ 
     Toast.makeText(Getstarted.this, "Option pressed= youtube",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Twitter){ 
     Toast.makeText(Getstarted.this, "Option pressed= twitter",Toast.LENGTH_LONG).show(); 
    } 
    return true;  

} 
+1

Cảm ơn, nhưng android: showAsAction = "always" -> app: showAsAction = "always" – Arnab

0

Xem các liên kết

http://www.codeproject.com/Articles/173121/Android-Menus-My-Way

http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

và tôi đề nghị bạn sử dụng ActionBarSherlock để tạo ra một menu tràn tùy chỉnh

Xem câu trả lời này biết làm thế nào để tạo mục trình đơn tràn sử dụng actionbar sherlock

ActionbarSherlock does not include "overflow" section of Action Bar (on Android 2.1)

+0

Tôi không muốn sử dụng thư viện bên ngoài hoặc trình đơn thả xuống vì đây là loại điều hướng và không phải là menu mục bổ sung và tôi được phát triển cho android 4+ – lory105

0

Bạn có lẽ hầu hết phải loại bỏ các mục thiết lập trong menu ví dụ: @ + id/action_settings.

Nếu bạn vẫn muốn nó có mặt ở đó, chỉ cần loại bỏ đó là "showAsActionAttribute" hoặc trao đổi nó để

android:showAsAction="always" 

Đối Item1 và Item2: Thêm showAsAction thuộc tính của chúng như android:showAsAction="ifRoom|withText"

Hy vọng rằng sẽ giúp.

0

Cách tốt nhất để thực hiện những gì bạn muốn đạt được là tăng một tùy chỉnh ActionBar.

Thực hiện các bước sau.

1) Tạo một XML RelativeLayout

2) Bao gồm một mục trình đơn và thẻ bên trong XML

3) Bơm thanh hành động thông qua các lớp ActionBar.

4) Đó là bạn đã hoàn tất !!

Cảnh báo: Đừng quên sử dụng thư viện tương thích !! Có một số phụ thuộc trong đó để làm việc trên.

0

khi nhấp chuột mục từ actionbar

PopupMenu popup = new PopupMenu(MainActivity.this, v); 
popup.getMenuInflater().inflate(
          R.mymenu xml , popup.getMenu()); 



mymenu.xml 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="ifRoom" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
     android:showAsAction="ifRoom|withText" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
android:showAsAction="ifRoom|withText"  
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="ifRoom" 
    android:title="@string/action_settings"/></menu> 
+0

Bạn có thể giải thích lý do và cách trả lời câu hỏi này không? Mã của bạn đang làm gì? – Ben

0

Hãy thử sử dụng

<item .... <any_damn_name>:showAsAction="ifRoom|withText" /> 

đừng quên để thêm

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

Và cố gắng để có menu riêng cho mảnh và toàn cầu (Cài đặt trong tệp menu Global.xml)

Đảm bảo bạn thổi phồng cả hai theo đúng thứ tự.

0

menu.xml:

<item android:id="@+id/game" 
     android:icon="@drawable/menu_addnew" 
     android:title="game" 
     android:showAsAction="ifRoom"/> 
<item android:id="@+id/help" 
     android:icon="@drawable/menu_addnew" 
     android:title="help" /> 

abc.class tập tin làm cho những thay đổi này:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.game_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.game: 
      Game(); 
      return true; 
     case R.id.help: 
      Help(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

Xem Menus tài liệu.

0

Tạo kiểu cho tràn trình đơn và chuyển vào phần mô tả nội dung

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:contentDescription">@string/accessibility_overflow</item> 
</style> 

<style name="Your.Theme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
</style> 

Gọi ViewGroup.findViewsWithText và chuyển vào mô tả nội dung của bạn. Hơi như thế này:

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

    // The content description used to locate the overflow button 
    final String overflowDesc = getString(R.string.accessibility_overflow); 
    // The top-level window 
    final ViewGroup decor = (ViewGroup) getWindow().getDecorView(); 
    // Wait a moment to ensure the overflow button can be located 
    decor.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // The List that contains the matching views 
      final ArrayList<View> outViews = new ArrayList<>(); 
      // Traverse the view-hierarchy and locate the overflow button 
      decor.findViewsWithText(outViews, overflowDesc, 
        View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 
      // Guard against any errors 
      if (outViews.isEmpty()) { 
       return; 
      } 
      // Do something with the view 
      final ImageButton overflow = (ImageButton) outViews.get(0); 
      overflow.setImageResource(R.drawable.ic_action_overflow); 

     } 

    }, 1000); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Add a dummy item to the overflow menu 
    menu.add("Overflow"); 
    return super.onCreateOptionsMenu(menu); 
} 

View.findViewsWithText đã được bổ sung ở mức API 14 chỉ. Vì vậy, hãy thử thực hiện một phương pháp theo cách bạn sở hữu như sau:

public static void findViewsWithText(List<View> outViews, ViewGroup parent, String targetDescription) { 
    if (parent == null || TextUtils.isEmpty(targetDescription)) { 
     return; 
    } 
    final int count = parent.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = parent.getChildAt(i); 
     final CharSequence desc = child.getContentDescription(); 
     if (!TextUtils.isEmpty(desc) && targetDescription.equals(desc.toString())) { 
      outViews.add(child); 
     } else if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) { 
      findViewsWithText(outViews, (ViewGroup) child, targetDescription); 
     } 
    } 
} 

Đây không phải là mã được thử nghiệm. Vì vậy, nếu có bất kỳ vấn đề nào trong khi bạn triển khai, vui lòng cho tôi biết.