it-swarm.com.de

Android: Ansichtsreferenz für ein Menüelement anzeigen

Ich plane, ein UI-Muster für schnelle Aktionen in meiner Anwendung zu verwenden. Android Quick Actions UI Pattern . Das Schnellaktionsfenster benötigt eine Pivotansicht, um festzuhalten. 

    quickAction.show(View pivotView);

Ich beabsichtige, eine schnelle Aktion für das Menüelement zu verwenden, ich kann auf das Element zugreifen, auf das geklickt wird. Aber das Problem ist, ich muss eine Ansicht aus dem Menüpunkt referenzieren, damit ich sie an die schnelle Aktion übergeben kann. 

Wie kann ich auf eine Ansicht im ausgewählten menuItem verweisen?.

43
Yashwanth Kumar

Sie können dies erreichen, indem Sie Ihrem Menüpunkt eine actionViewClass -Eigenschaft in xml zur Verfügung stellen. Anschließend erhalten Sie die gewünschte Pivotansicht. Der Code wäre so ähnlich 

<item
    Android:id="@+id/menu_find"
    Android:showAsAction="ifRoom"
    Android:actionViewClass="Android.widget.ImageButton"
    />

Tun Sie dies in Ihrem OnCreateOptionsMenu

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.menu_search, menu);
    locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
    locButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            createPopup();
            mQuickAction.show(v);
        }
    });
    return true;
}
89
ASH

Alte Frage, aber ich habe Probleme mit dem actionViewClass-Attribut. Für alle, die später darauf stoßen ...

Wenn Sie findViewById(R.id.mnu_item) in onOptionsItemSelected aufrufen, wird ein View-Anker zurückgegeben.

QuickActions auf MenuItems ist kein gutes Design, aber ich habe festgestellt, dass dies die einfachste Möglichkeit ist, Untermenüs mit benutzerdefinierten Hintergründen zu implementieren.

35
loadedion

Um Referenzansichten von Menüelementen zu erhalten müssen wir dies tun,

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

    new Handler().post(new Runnable() {
        @Override
        public void run() {

            final View menuItemView = findViewById(R.id.action_preview);
            // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE

        }
    });


    return true;
}
4
jazzbpn

Ein Update für alle, die den Menüpunkt aus anderen Gründen finden möchten (wie ich es wollte).

Wenn Sie Zugriff auf die AppCompat-Symbolleiste haben und diese verwenden, gibt es eine Möglichkeit. Dies ist nicht der effizienteste Weg, aber es ist der einfachste Weg, auf die Ansicht des Menüelements zuzugreifen.

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    // Find Menu
    for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
        View view = toolbar.getChildAt(toolbarChildIndex);

        // Found Menu
        if (view instanceof ActionMenuView) {
            ActionMenuView menuView = (ActionMenuView) view;

            // All menu items
            for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
                ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
                // Do something to itemView...
            }
        }
    }
}
2
Senth

in der Hauptaktivitätsklasse sollte die Methode onOptionsItemSelected (...) am besten überschrieben werden. sollte etwas wie folgt sein:

public boolean onOptionsItemSelected(MenuItem item) {
  // the id is of type int
  int someId = item.getItemId();
  // can use an if() or switch() statement to check if id is selected
  //a Toast message can be used to show item is selected
}
0
odins

Sie können wie folgt auf einen Menüpunkt verweisen:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite);

Und dann mach was du willst. Z.B. Ändern Sie das Symbol wie folgt:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
0
Ivo Stoyanov