Same button on multiple activities

2019-03-16 03:20发布

问题:

right i have a sign in button located exactly in the same place on every activity and i have bout 20 activities at the moment but will rise a lot higher soon, and i don't really want to be copying and pasting the same code in to each activity, so I'm looking for a simple, efficient solution to handle the onClick event which will work globally throughout the app.

For example, if User A clicks on the sign in button on Activity 1 and signs in, it will show that he is signed in on Activity 2 and 3 and so on.. until they log out.

The sign in button has the same ID throughout the whole application which is "@+id/signIn"

Would it be easier to call a single function at the beginning of each activity? I thought that wouldn't be every effective use of processing power etc?!

Any suggestions and/or guidance would be much appreciated. Thank you :)

回答1:

You can't avoid implementing that listener in all of your activities in either ways. But you can do it in a bit more organized way:

You could write a custom header layout for your application (/res/layout/header.xml), in which you have the "Sign In" button with a click listener set (pointing to an onSignInClicked method):

android:onClick="onSignInClicked"

Then you include this header to each activity layout:

<include android:id="@+id/header" layout="@layout/header" />

You could also create an interface which contains an onSignInClicked method declaration, and by all your activities implementing that interface you force them to define the onSignInClicked method's body.

What you actually do there can also be wrapped into

  • a static method inside a globally accessible class, or
  • a well-parametrized method inside your Application extension class.

so in all of your activities this method can be:

public static void onSignInClicked(View view)
{
    // static method with call with reference to the current activity
    SignInHelper.doSignIn(this);
}

or

public static void onSignInClicked(View view)
{
    // global method in your `Application` extension
    // with reference to the current activity
    ((MyApplication)getApplicationContext()).doSignIn(this);
}

If you choose the second way, don't forget to update your androidManifes.xml by setting the name attribute of your application tag:

<application android:name=".MyApplication" [...]


回答2:

You could create the button as a custom view.