Ich arbeite an einer Android-Anwendung, bei der ich ActionBar
verwende. Es gibt also ein Symbol für die Navigationsleiste zum Öffnen und den Titel von ActionBar
in ActionBar
. Ich möchte einen Klicklistener auf den Titel von ActionBar
setzen, so dass er eine neue Activity
startet, und den Klicklistener im Navigations-Schubladensymbol zum Öffnen des Navigations-Schubladenmenüs festlegen.
Ich habe einen Klick auf das Symbol für die Navigationsleiste erreicht, aber wenn ich auf den Titel von ActionBar
klicke, wird auch das Menü für die Navigationsleiste geöffnet. Gibt es eine Möglichkeit, einen anderen Klicklistener für den Titel von ActionBar
festzulegen.
Danke im Voraus.
Versuchen Sie, diesen Code unter der Funktion onCreate () hinzuzufügen. Dadurch wird die Ressource erfasst, unter der sich der Titel der Aktionsleiste befindet, und es wird eine ID zugewiesen, mit der Sie einen OnClickListener hinzufügen können. Lass mich wissen, wie es geht!
final int abTitleId = getResources().getIdentifier("action_bar_title", "id", "Android");
findViewById(abTitleId).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Do something
}
});
Sie können ein benutzerdefiniertes Layout für den Titel verwenden und ihm einen Listener zuweisen:
@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>
Ich denke, die Antwort von Simas ist die beste, aber hier ist eine hackige Version, falls Sie das vorziehen.
ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);
Diese sollte universal sein, so dass es funktioniert mit:
ActionBar
Theme.AppCompat
Unterstützung ActionBar
setActionBar
<Toolbar Android:id="@+id/action_bar"
Toolbar
als root
setSupportActionBar
<Android.support.v7.widget.Toolbar Android:id="@id/action_bar"
Toolbar
als root
Toolbar
-Implementierungen müssen möglicherweise etwas angepasst werden.Obwohl ich nur mit Unterstützung getestet habe: 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;
}
Wenn Sie die Toolbar mit Unterstützung v7: 21 verwenden, überprüfen Sie den folgenden Code:
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
}
});
Sie können dies einfach mit der Symbolleiste tun. Definieren Sie die Symbolleiste in der Layout-XML-Datei wie folgt:
<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>
Dann können Sie den Listener in Activity mit diesem Code festlegen:
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
}
});
Wenn Sie die aktuell vorhandene ActionBar und nicht die Symbolleiste verwenden möchten, verwenden Sie Folgendes:
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);
}
});
}
}
}
Sie können dies einfach mit der Symbolleiste tun. Definieren Sie die Symbolleiste in der Layout-XML-Datei wie folgt:
<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>
Dann können Sie den Listener in Activity mit diesem Code festlegen:
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();
}
});
Wenn Sie den tatsächlichen Text in Ihrem Titel kennen und sich ziemlich sicher sind, dass keine andere TextView
auf dem Bildschirm diesen Titel freigibt, können Sie eine rekursive View-Tree-Suche verwenden, um ihn zu finden.
Dies ist eine großartige Lösung, da keine internen Kenntnisse über die Erstellung der Toolbar erforderlich sind und Sie direkten Zugriff auf die Variable TextView
haben.
@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;
}
Die zuverlässigste Ansicht, auf der Sie dies aufrufen können, ist die Dekoransicht. Sie können jedoch experimentieren, was für Ihre Zwecke am besten geeignet ist. Ihre Laufleistung kann variieren.
View found = findTextViewWithText(
getActivity().getWindow().getDecorView(), "My Title");
if (found != null) {
// Do something, like set a click listener
}