私はAndroid ActionBar
を使用しているアプリケーションに取り組んでいるので、それを開くナビゲーション引き出しアイコンとActionBar
のActionBar
のタイトルがあります。 ActionBar
のタイトルにクリックリスナを設定して、新しいActivity
を開始し、ナビゲーションドロワーアイコンに異なるクリックリスナを設定して、ナビゲーションドロワーメニューを開きます。
ナビゲーションドロワーアイコンをクリックしましたが、ActionBar
タイトルのタイトルをクリックすると、ナビゲーションドロワーメニューが開きます。 ActionBar
のタイトルに異なるクリックリスナーを設定する方法はありますか。
前もって感謝します。
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
}
});
タイトルにカスタムレイアウトを使用し、リスナーを割り当てることができます。
@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>
Simasの答え が最高だと思いますが、それを好む場合に備えてハックバージョンを紹介します。
ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);
Thisone:universalである必要があります:
ActionBar
Theme.AppCompat
サポートActionBar
setActionBar
<Toolbar Android:id="@+id/action_bar"
Toolbar
をroot
として渡すsetSupportActionBar
<Android.support.v7.widget.Toolbar Android:id="@id/action_bar"
Toolbar
をroot
として渡す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;
}
サポート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
}
});
これは、ツールバーを使用して簡単に行うことができます。以下に示すように、レイアウト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
}
});
ツールバーではなく、現在存在する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);
}
});
}
}
}
これは、ツールバーを使用して簡単に行うことができます。以下に示すように、レイアウト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();
}
});
タイトルにある実際のテキストがわかっていて、画面上の他の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
}