19

Toolbar私の(チュートリアルに取り組んでいる)引き出しアイコンを強調表示したいと思います。そのためには、その位置が必要です。ドロワーのナビゲーション アイコン (ハンバーガー) ビューへの参照を取得するにはどうすればよいですか?

4

4 に答える 4

29

ビューのコンテンツ記述を利用してから、findViewWithText()メソッドを使用してビュー参照を取得できます

 public static View getToolbarNavigationIcon(Toolbar toolbar){
        //check if contentDescription previously was set
        boolean hadContentDescription = !TextUtils.isEmpty(toolbar.getNavigationContentDescription());
        String contentDescription = hadContentDescription ? toolbar.getNavigationContentDescription() : "navigationIcon";
        toolbar.setNavigationContentDescription(contentDescription);
        ArrayList<View> potentialViews = new ArrayList<View>();
        //find the view based on it's content description, set programatically or with android:contentDescription
        toolbar.findViewsWithText(potentialViews,contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        //Nav icon is always instantiated at this point because calling setNavigationContentDescription ensures its existence 
        View navIcon = null;
        if(potentialViews.size() > 0){
            navIcon = potentialViews.get(0); //navigation icon is ImageButton
        }
         //Clear content description if not previously present
        if(!hadContentDescription)
            toolbar.setNavigationContentDescription(null);
        return navIcon;
     }

もっと

Kotlin 拡張プロパティ:

val Toolbar.navigationIconView: View?
        get() {
            //check if contentDescription previously was set
            val hadContentDescription = !TextUtils.isEmpty(navigationContentDescription)
            val contentDescription = if (hadContentDescription) navigationContentDescription else "navigationIcon"
            navigationContentDescription = contentDescription
            val potentialViews = arrayListOf<View>()
            //find the view based on it's content description, set programatically or with android:contentDescription
            findViewsWithText(potentialViews, contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION)
            //Clear content description if not previously present
            if (!hadContentDescription) {
                navigationContentDescription = null
            }
            //Nav icon is always instantiated at this point because calling setNavigationContentDescription ensures its existence
            return potentialViews.firstOrNull()
        }
于 2015-04-29T22:57:23.877 に答える
8

ツールバーの子ビューをデバッグ モードで調べたところ、ドロワー アイコンが ImageButton としてそこにあることがわかりました。(ありがとうエルツ)

2 つの子 (LinearLayout と ImageView) を持つカスタム xml レイアウトのツールバーを使用するため、最終的にツールバーには次の位置に 4 つの子がありました。

[0] LinearLayout(from custom xml)
[1] ImageView(from custom xml)
[2] ImageButton(drawer icon)
[3] ActionMenuView(menu icon)

これを知って、私は今使用することができます:

View drawerIcon = toolbar.getChildAt(2);

ドロワー メニュー アイコンへの参照を取得します。私の場合、位置は 2 です。この位置は、カスタム ツールバー レイアウトの子ビューの数と同じにする必要があります。

誰かがより良い解決策を見つけたら、私に知らせてください。

于 2015-04-29T22:52:35.677 に答える
8

Drawableツールバーのナビゲーション アイコンを表すだけを取得したい場合は、次のようにします。

Drawable d = mToolbar.getNavigationIcon();

次のようなメソッドを使用して、ツールバーのナビゲーション アイコンに使用される ImageButton への参照を取得できます。

public ImageButton getToolbarNavigationButton() {
    int size = mToolbar.getChildCount();
    for (int i = 0; i < size; i++) {
        View child = mToolbar.getChildAt(i);
        if (child instanceof ImageButton) {
            ImageButton btn = (ImageButton) child;
            if (btn.getDrawable() == mToolbar.getNavigationIcon()) {
                return btn;
            }
        }
    }
    return null;
}
于 2016-07-11T23:44:36.203 に答える
0

即興@Nikola Despotoskiの答え

public static View getNavigationIconView(Toolbar toolbar) { 

    String previousContentDescription = (String) toolbar.getNavigationContentDescription();
    // Check if contentDescription previously was set
    boolean hadContentDescription = !TextUtils.isEmpty(previousContentDescription);
    String contentDescription = hadContentDescription ? 
            previousContentDescription : "navigationIcon";
    toolbar.setNavigationContentDescription(contentDescription);

    ArrayList<View> potentialViews = new ArrayList<>();
    // Find the view based on it's content description, set programmatically or with
    // android:contentDescription
    toolbar.findViewsWithText(potentialViews, contentDescription,
            View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);

    // Nav icon is always instantiated at this point because calling
    // setNavigationContentDescription ensures its existence
    View navIcon = null;
    if (potentialViews.size() > 0) {
        navIcon = potentialViews.get(0); //navigation icon is ImageButton
    }

    // Clear content description if not previously present
    if (!hadContentDescription)
        toolbar.setNavigationContentDescription(previousContentDescription);

    return navIcon;
}
于 2018-07-26T06:42:09.643 に答える