wake-up-neo.com

Legen Sie OnClick Listener in Action Bar Title in Android fest

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.

22
N Sharma

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
    }
});
22
Jake Weso

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>
15
Simas

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:

  • lager Android ActionBar
  • Theme.AppCompat Unterstützung ActionBar
  • v21-style setActionBar
    benutze <Toolbar Android:id="@+id/action_bar"
    oder übergeben Sie die aufgeblasene Toolbar als root
  • v21-style setSupportActionBar
    benutze <Android.support.v7.widget.Toolbar Android:id="@id/action_bar"
    oder übergeben Sie die aufgeblasene Toolbar als root
  • benutzerdefinierte Toolbar-Implementierungen müssen möglicherweise etwas angepasst werden.
    Sie könnten dies jedoch in dieser benutzerdefinierten Klasse einkapseln.

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;
}
9
TWiStErRob

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

            }
        });
7
Dejavu

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
        }
    });
6
jimmy0251

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);
                }
            });
        }
     }
}    
1
Chris Sprague

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();
 }
});
0
Wajid khan

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
}
0
Kevin Grant