2013-04-18 37 views
14

Tôi đang phát triển một ứng dụng mà tôi phải thêm bố cục tùy chỉnh trên thanh tác vụ. Thêm bố trí tùy chỉnh được thực hiện, nhưng khi tôi thêm các mục trình đơn trên thanh tác vụ, bố cục tùy chỉnh của tôi thay đổi vị trí của nó từ bên phải của thanh hành động đến trung tâm của thanh hành động. Dưới đây là hình ảnh những gì tôi đã đạt được cho đến nay.Cách thay đổi vị trí của các mục menu trên thanh tác vụ

Done till here

Tôi muốn một cái gì đó như thế này trên thanh tác vụ.

Like this

Bố cục tùy chỉnh (nút màu vàng) ở bên phải nhất một phần của mục actionbar và menu ở giữa.

Thêm mã của tôi để đạt được bố trí tùy chỉnh này sử dụng có nguồn gốc actionbar android:

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

    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    actionBar = getActionBar(); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayUseLogoEnabled(false); 
    actionBar.setDisplayHomeAsUpEnabled(false); 
    actionBar.setDisplayShowCustomEnabled(true); 
    cView = getLayoutInflater().inflate(R.layout.header, null); 
    actionBar.setCustomView(cView); 

} 

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

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 

    case android.R.id.home: 
     finish(); 

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

Làm thế nào điều này có thể đạt được?

Mọi loại trợ giúp sẽ được đánh giá cao.

Trả lời

3

Tôi giả sử bạn đang đặt chế độ xem tùy chỉnh làm chế độ xem tùy chỉnh trong thanh tác vụ. Nếu bạn đang sử dụng ActionbarSherlock, bạn có thể thêm chế độ xem tùy chỉnh làm mục menu thông thường và đặt chế độ xem hành động cho mục đó bằng cách sử dụng .setActionView(yourCustomView or yourCustomLayoutId). Sau đó, bạn có thể đặt .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) để hiển thị chế độ xem. Chỉ cần đảm bảo chế độ xem tùy chỉnh của bạn được đặt thành chiều rộng wrap_content hoặc nếu không, chế độ xem sẽ đẩy các mục menu khác ra khỏi màn hình. Điều này cũng có thể làm việc mà không có ActionbarSherlock, nhưng tôi chưa thử nó ở đó.

EDIT: Hãy thử thay đổi phương pháp onCreateOptionsMenu bạn

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.websearch_menu, menu); 

    // add this 
    menu.add(Menu.NONE, 0, Menu.NONE, "custom") 
     .setActionView(R.layout.header) 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    return true; 
} 

và loại bỏ điều này từ phương pháp onCreate của bạn

actionBar.setDisplayShowCustomEnabled(true); 
cView = getLayoutInflater().inflate(R.layout.header, null); 
actionBar.setCustomView(cView); 

EDIT:

Nếu bạn cần phải tham khảo các quan điểm từ bố trí tùy chỉnh của bạn, bạn có thể làm điều này trong phương thức onCreateOptionsMenu của bạn như sau (lưu ý: Tôi đã viết mã này trong trình duyệt, vì vậy không đảm bảo rằng tôi đã không tạo lỗi đánh máy hoặc một số điều):

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // inflate the menu and add the item with id viewId, 
    // which has your layout as actionview 

    View actionView = menu.getItem(viewId).getActionView(); 
    View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout); 

    // here you can set listeners to your view or store a reference 
    // to it somewhere, so you can use it later 

    return true; 
} 
+0

Tôi đã thêm mã của mình. Tôi đang sử dụng thanh tác vụ android mặc định. – Anupam

+0

Tôi đã thêm mã làm thế nào để làm điều này với ActionbarSherlock, tôi hy vọng nó là như nhau với Actionbar mặc định – Thrakbad

+0

Bạn đá anh chàng. Cảm ơn bạn rất nhiều, bạn đã lưu tôi từ việc tạo một bố cục tùy chỉnh hoàn chỉnh và sau đó thổi nó vào thanh hành động. Thanx! – Anupam

0

Một cách để đạt được điều này là bằng cách gọi invalidateOptionMenu và trong phương thức onCreateOptionsMenu, đặt các mục theo thứ tự bạn muốn đặt chúng.

BTW, nếu bạn sử dụng ActionBarSherlock, phương pháp này có sẵn, vì vậy hãy bỏ qua cảnh báo Lint về nó.

+0

Bạn có thể hướng dẫn tôi cách đạt được điều này không? Bất kỳ loại mã nào cũng sẽ giúp ích cho tôi. – Anupam

+0

Có, bất cứ nơi nào bạn muốn thay đổi thứ tự của các mục, lưu cấu hình thứ tự của các mục và gọi invalidateOptionMenu(). Sau đó, trong phương thức onCreateOptionsMenu(), hãy kiểm tra các cấu hình bạn đã lưu trữ và sử dụng một vòng lặp, chuyển qua tất cả các mục bạn muốn chèn theo thứ tự của chúng và thêm chúng vào trình đơn một cách tự động. Bạn nên làm điều đó bằng cách truy cập vào biến "menu" của onCreateOptionsMenu(). Nếu bạn muốn chứa các mục hành động "tĩnh" bằng cách thổi phồng, thì đó là ok, chỉ cần tìm chính xác vị trí đặt phần còn lại bên trong trình đơn. –

2

Thứ tự của các mục menu sẽ được đặt theo thứ tự của chúng trong tệp XML mà chúng bị thổi phồng.

Vì vậy, tất cả những gì bạn cần làm là thay đổi thứ tự trong tệp XML theo ý muốn.

10

Chỉ cần sử dụng orderInCategory trong tệp xml của bạn và nó sẽ đặt hàng từ số ít hơn đến lớn hơn (từ bên trái thanh tác vụ của bạn).Chẳng hạn như:

<item 
    android:id="@+id/Refresh" 
    android:icon="@drawable/ic_action_refresh" 
    android:showAsAction="ifRoom" 
    android:title="@string/refresh" 
    android:orderInCategory="2"/> 
<item 
    android:id="@+id/Search" 
    android:icon="@drawable/ic_action_action_search" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:title="@string/search" 
    android:orderInCategory="1"/> 

Mặc dù, Refresh mục đang đến đầu tiên trong tập tin xml, nó sẽ không là người đầu tiên. Nhưng Tìm kiếm biểu tượng từ trái sang rigth trên thanh tác vụ của bạn sẽ là đầu tiên theo thuộc tính orderInCategory của nó.

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