2015-05-02 14 views
11

Tôi có những mục trình đơn trong tôi menu_main.xmlLàm thế nào để lập trình kích hoạt/bấm vào một MenuItem trong Android?

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

    <item android:id="@+id/action_restart" android:title="Restart" 
     android:orderInCategory="1" /> 
    <item android:id="@+id/action_clear" android:title="Clear" 
     android:orderInCategory="2" /> 
    <item android:id="@+id/action_update" android:title="Update" 
     android:orderInCategory="3" /> 
    <item android:id="@+id/action_about" android:title="About" 
     android:orderInCategory="4" /> 
    <item android:id="@+id/action_try_restart" android:title="Try Restart" 
     android:orderInCategory="5" /> 
</menu> 

Và tôi có điều này trong onOptionsItemSelected phương pháp của tôi:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    if (id == R.id.action_restart) { 
     Toast.makeText(MainActivity.this, "Restart...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_clear) { 
     Toast.makeText(MainActivity.this, "Clear...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_update) { 
     Toast.makeText(MainActivity.this, "Update...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_about) { 
     Toast.makeText(MainActivity.this, "About...", Toast.LENGTH_LONG).show(); 
    } 

    if(id == R.id.action_try_restart) { 
     // how to click/trigger the "action_restart" from here? 
    } 

    return super.onOptionsItemSelected(item); 
} 

Tôi đã thử với:

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart); 
actionRestart; // 

Nhưng actionRestart tham khảo doesn' t cung cấp mọi thứ như click, trigger, v.v.

Tôi cũng muốn lưu ý rằng tôi mới phát triển Android và tôi đến từ nền PHP/JavaScript, vì vậy mức độ OOP Java này hoàn toàn mới đối với tôi.

Trả lời

7

Theo như tôi biết, không có cơ chế trong SDK cho phép bạn thực hiện việc này. Nó chắc chắn không phải là tiêu chuẩn thực hành để làm điều này loại điều.

Tôi khuyên bạn nên tách logic của mình khỏi giao diện người dùng thực tế càng nhiều càng tốt, vì vậy bạn sẽ không phải cần để mô phỏng một nhấp chuột để kích hoạt hành động. Vì bạn là một nhà phát triển Web, điều này sẽ đến khá dễ dàng với bạn.

Trong trường hợp này, bạn muốn cấu trúc lại các biểu tượng thành một phương thức riêng biệt (hoặc nhiều phương pháp), sau đó gọi cả khi mục menu được nhấp và khi bạn muốn kích hoạt thủ công.

Hoặc, bạn có thể thử lấy MenuItem được trả về bởi findViewById() và chuyển nó đến trình xử lý của bạn ở đó. Nhưng tôi không biết liệu nó có hiệu quả không.

+1

Thanks buddy/Hvala Zemljače! Tôi đã thực hiện một phương pháp riêng biệt mà tôi gọi nó trên cả hai; 'action_restart' và' action_try_restart', để phù hợp với nhu cầu của tôi bây giờ. Chúc mừng! – omerowitz

+0

bạn có thể sử dụng phương thức performIdentifierAction – Simon

10

Bạn nên gọi thủ công cho người nghe của mình, với mục được yêu cầu làm thông số.

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart); 
onOptionsItemSelected(actionRestart); 
+2

Tôi cũng sẽ thử điều này! Tôi đã thực hiện một phương pháp riêng biệt, như tôi đã mô tả trong câu trả lời của Veselin Romic ở trên. Cảm ơn. – omerowitz

+3

java.lang.ClassCastException: android.support.v7.view.menu.ActionMenuItemView không thể truyền sang android.view.MenuItem –

3

Mặc dù nó không phải là cách tốt nhất để làm,

MenuItem item_your_choice; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.your_menu, menu); 
    item_your_choice = menu.findItem(R.id.item_your_choice); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case item_your_choice: 
    //do whatever you want 
    break; 
} 

just Call from any method 
    onOptionsItemSelected(item_you_choice); 
-2

Có một phương pháp tiêu chuẩn để làm điều này -
Tạo một thể hiện mới của MenuItem lớp và thay đổi phương pháp ghi đè getItemId() trở lại id của mục menu mong muốn và để phần còn lại không thay đổi.

MenuItem actionRestart = new MenuItem() { 
              @Override 
              public int getItemId() { 
               return R.id.action_restart; 
              } 

              ... 

              }; 
onOptionsItemSelected(actionRestart); 
+0

Thao tác này sẽ ghi đè tất cả phương thức giao diện của MenuItem, làm cho mã của bạn lộn xộn – AimanB

3

Tôi cũng muốn chia sẻ giải pháp của mình ở đây. Thay vì cố gắng bấm vào một mục trình đơn, tôi đã tạo một phương thức riêng biệt cho mục menu, và gọi nó ở bất cứ nơi nào tôi cần bấm vào mục menu. OnOptionsItemSelected phương pháp trông như sau. Như bạn thấy, tôi đã chuyển logic nhấp chuột sang một phương thức riêng biệt.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home) { 
     homeClicked(); 
    } 
    return super.onOptionsItemSelected(item); 
} 
private void homeClicked(){ 
    ... 
} 

Bây giờ bạn có thể gọi homeClicked bất cứ khi nào bạn cần nhấp vào mục trình đơn theo chương trình.

+1

cách tiếp cận tốt đẹp như chúng tôi không ' t có phương thức gốc – MilapTank

1

Sử dụng phương pháp performIdentifierAction, như thế này:

menu.performIdentifierAction(R.id.action_restart, 0); 
0

Theo mẫu của bạn trong mục menu trên:

<item android:id="@+id/action_restart" android:title="Restart" 
     android:orderInCategory="1" /> 

sử dụng callOnClick() phương pháp:

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick(); 
Các vấn đề liên quan