web-dev-qa-db-ja.com

AndroidのアクションバーのタイトルにOnClickリスナーを設定します

私はAndroid ActionBarを使用しているアプリケーションに取り組んでいるので、それを開くナビゲーション引き出しアイコンとActionBarActionBarのタイトルがあります。 ActionBarのタイトルにクリックリスナを設定して、新しいActivityを開始し、ナビゲーションドロワーアイコンに異なるクリックリスナを設定して、ナビゲーションドロワーメニューを開きます。

ナビゲーションドロワーアイコンをクリックしましたが、ActionBarタイトルのタイトルをクリックすると、ナビゲーションドロワーメニューが開きます。 ActionBarのタイトルに異なるクリックリスナーを設定する方法はありますか。

前もって感謝します。

24
N Sharma

OnCreate()関数の下にこのコードを追加してみてください。これにより、アクションバーのタイトルが置かれているリソースが取得され、OnClickListenerを追加するために使用できるIDが割り当てられます。それがどうなるか教えてください!

final int abTitleId = getResources().getIdentifier("action_bar_title", "id", "Android");
findViewById(abTitleId).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
    //Do something
    }
});
23
Jake Weso

タイトルにカスタムレイアウトを使用し、リスナーを割り当てることができます。

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

    ActionBar actionBar = getActionBar();
    if (actionBar != null) {
        // Disable the default and enable the custom
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowCustomEnabled(true);
        View customView = getLayoutInflater().inflate(R.layout.actionbar_title, null);
        // Get the textview of the title
        TextView customTitle = (TextView) customView.findViewById(R.id.actionbarTitle);


        // Change the font family (optional)
        customTitle.setTypeface(Typeface.MONOSPACE);
        // Set the on click listener for the title
        customTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("MainActivity", "ActionBar's title clicked.");
            }
        });
        // Apply the custom view
        actionBar.setCustomView(customView);
    }
}

actionbar_title.xml

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:gravity="center">

    <TextView
        Android:id="@+id/actionbarTitle"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="25sp"
        Android:text="@string/app_name"/>

</LinearLayout>
16
Simas

Simasの答え が最高だと思いますが、それを好む場合に備えてハックバージョンを紹介します。

ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);

Thisone:universalである必要があります:

  • stock Android ActionBar
  • Theme.AppCompatサポートActionBar
  • v21スタイルsetActionBar
    つかいます <Toolbar Android:id="@+id/action_bar"
    または膨張したToolbarrootとして渡す
  • v21スタイルsetSupportActionBar
    つかいます <Android.support.v7.widget.Toolbar Android:id="@id/action_bar"
    または膨張したToolbarrootとして渡す
  • カスタムToolbar実装には少し調整が必要な場合がありますが、
    しかし、このカスタムクラスにこれをカプセル化できます。

私はsupport:v22でしかテストしていませんでした。

/** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */
public static @Nullable View findActionBarTitle(@NonNull View root) {
    return findActionBarItem(root, "action_bar_title", "mTitleTextView");
}
/** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */
public static @Nullable View findActionBarSubTitle(@NonNull View root) {
    return findActionBarItem(root, "action_bar_subtitle", "mSubtitleTextView");
}

private static @Nullable View findActionBarItem(@NonNull View root,
        @NonNull String resourceName, @NonNull String toolbarFieldName) {
    View result = findViewSupportOrAndroid(root, resourceName);

    if (result == null) {
        View actionBar = findViewSupportOrAndroid(root, "action_bar");
        if (actionBar != null) {
            result = reflectiveRead(actionBar, toolbarFieldName);
        }
    }
    if (result == null && root.getClass().getName().endsWith("widget.Toolbar")) {
        result = reflectiveRead(root, toolbarFieldName);
    }
    return result;
}

@SuppressWarnings("ConstantConditions")
private static @Nullable View findViewSupportOrAndroid(@NonNull View root, @NonNull String resourceName) {
    Context context = root.getContext();
    View result = null;
    if (result == null) {
        int supportID = context.getResources().getIdentifier(resourceName, "id", context.getPackageName());
        result = root.findViewById(supportID);
    }
    if (result == null) {
        int androidID = context.getResources().getIdentifier(resourceName, "id", "Android");
        result = root.findViewById(androidID);
    }
    return result;
}

@SuppressWarnings("unchecked")
public static <T> @Nullable T reflectiveRead(@NonNull Object object, @NonNull String fieldName) {
    try {
        Field field = object.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        return (T)field.get(object);
    } catch (Exception ex) {
        Log.w("HACK", "Cannot read " + fieldName + " in " + object, ex);
    }
    return null;
}
10
TWiStErRob

サポートv7:21でツールバーを使用している場合。次のコードを確認してください。

Field titleField = Toolbar.class.getDeclaredField("mTitleTextView");
        titleField.setAccessible(true);
        TextView barTitleView = (TextView) titleField.get(mToolbar);
        barTitleView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });
7
Dejavu

これは、ツールバーを使用して簡単に行うことができます。以下に示すように、レイアウトxmlファイルでツールバーを定義します。

 <Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?actionBarSize"
    Android:background="?colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <TextView
        Android:id="@+id/toolbarTitle"
        style="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
        Android:background="?attr/selectableItemBackground"
        Android:layout_width="wrap_content"
        Android:gravity="center_vertical"
        Android:layout_height="match_parent" />
</Android.support.v7.widget.Toolbar>

次に、このコードを使用してActivityでリスナーを設定できます。

setSupportActionBar((Toolbar) findViewById(R.id.toolbar));

TextView toolbarTitle= (TextView) findViewById(R.id.toolbarTitle);
toolbarTitle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // DO SOMETHING HERE
        }
    });
6
jimmy0251

ツールバーではなく、現在存在するActionBarを使用する場合は、次を使用します。

ActionBar actBar = getSupportActionBar();
if(actBar != null) {
    actBar.setTitle(R.string.your_ab_title);
 }

//Set actions to take when the AB is clicked
Toolbar ab = findViewById(R.id.action_bar);
if(ab != null){
    for (int i= 0; i < ab.getChildCount(); i++){

        View child = ab.getChildAt(i);

        if(child instanceof TextView || child instanceof ImageView) {
            child.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String url = "http://www.HoverDroids.com";

                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i);
                }
            });
        }
     }
}    
1
Chris Sprague

これは、ツールバーを使用して簡単に行うことができます。以下に示すように、レイアウトxmlファイルでツールバーを定義します。

    <Android.support.v7.widget.Toolbar
    Android:id="@+id/MainActivityToolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="@color/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:text="@string/app_name"
            Android:textSize="30sp"
            tools:ignore="RelativeOverlap"

            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            />
        <Button
            Android:id="@+id/LogOutButton"
            Android:layout_width="100dp"
            Android:layout_height="wrap_content"
            Android:layout_alignParentEnd="true"
            Android:layout_alignParentRight="true"

            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"

            Android:text="@string/logout" />
    </RelativeLayout>

</Android.support.v7.widget.Toolbar>

次に、このコードを使用してActivityでリスナーを設定できます。

setSupportActionBar((Toolbar) findViewById(R.id.MainActivityToolbar));

logOutButton =  findViewById(R.id.LogOutButton);
logOutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   //define your function for logout or something else 
   LogOut();
 }
});
0
Wajid khan

タイトルにある実際のテキストがわかっていて、画面上の他のTextViewがそのタイトルを共有していないことが合理的にわかっている場合は、再帰ビューツリー検索を使用して検索できます。

これは、ツールバーの構築方法に関する内部知識を反映する必要がなく、TextViewに直接アクセスできるため、優れたソリューションです。

@Nullable
public static TextView findTextViewWithText(@Nullable View toCheck, String toFind) {

    if (toCheck instanceof TextView) {
        String foundText = ((TextView) toCheck).getText().toString();
        if (foundText.equals(toFind)) {
            return (TextView) toCheck;
        }

    } else if (toCheck instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) toCheck).getChildCount(); i++) {
            TextView found = findTextViewWithText(((ViewGroup) toCheck).getChildAt(i), toFind);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
}

これを呼び出す最も信頼できるビューは装飾ビューですが、目的に最適なものを自由に試してみてください。走行距離は異なる場合があります。

View found = findTextViewWithText(
    getActivity().getWindow().getDecorView(), "My Title");
if (found != null) {
  // Do something, like set a click listener
}
0
Kevin Grant