开发者

Common Clickable Header for All Activities in Android

开发者 https://www.devze.com 2023-04-05 09:10 出处:网络
I have an application with a common Header in all layouts. I want that whenever the user clicks at the the ImageView with id btn_home, the app will go back to a specific activity, my \"Main\" for inst

I have an application with a common Header in all layouts. I want that whenever the user clicks at the the ImageView with id btn_home, the app will go back to a specific activity, my "Main" for instance.

What is the best way to do that?

I know that I can define the onClick(View v) for every activity, but maybe there is a better way to do that. Even making every activity be some (via heritage) other that has the onClick(View v) defined sounds bad.

header.xml

<RelativeLayout ...>
    <RelativeLayout android:id="@+id/relativeLayout1" ...>
        <ImageView android:id="@+id/logo_cats"></ImageView>
        <ImageView android:id="@+id/btn_home" ...></ImageView>
    </RelativeLayout>
</RelativeLayout>

every layout

...
<include layout="@layout/header" android:id="@开发者_开发百科+id/header"
        android:layout_height="wrap_content" android:layout_width="fill_parent" />
...


You can make a custom component out of your header and define 'onClick()' in it. For example, make a new class Header that would extend a RelativeLayout and inflate your header.xml there. Then, instead of <include> tag you would use <com.example.app.Header android:id="@+id/header" .... No code duplication and the header becomes totally reusable.

UPD: Here's some code examples

header.xml:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView android:id="@+id/logo" .../>
    <TextView android:id="@+id/label" .../>
    <Button android:id="@+id/login" .../>
</merge>

activity_with_header.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" ...>
    <com.example.app.Header android:id="@+id/header" .../>
    <!-- Other views -->
</RelativeLayout>

Header.java:

public class Header extends RelativeLayout {
public static final String TAG = Header.class.getSimpleName();

protected ImageView logo;
private TextView label;
private Button loginButton;

public Header(Context context) {
    super(context);
}

public Header(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public Header(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public void initHeader() {
        inflateHeader();
}

private void inflateHeader() {
    LayoutInflater inflater = (LayoutInflater) getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.header, this);
    logo = (ImageView) findViewById(R.id.logo);
    label = (TextView) findViewById(R.id.label);
    loginButton = (Button) findViewById(R.id.login);
}

ActivityWithHeader.java:

public class ActivityWithHeader extends Activity {
private View mCreate;

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

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_with_header);

    Header header = (Header) findViewById(R.id.header);
    header.initHeader();
    // and so on
}
}

In this example, Header.initHeader() can be moved inside Header's constructor, but generally this method provides a nice way to pass on some useful listeners. Hope this will help.


Extend the Activity class and build a MyActivity class for example. In this MyActivity class you could include the code for the onClick.

Now create a layout that just holds your header. Include that layout in your activity layouts.

Extend all your activities from MyActivity - that's it.

If you need the same behaviour in ListActivities create a MyListActivity as well.

0

精彩评论

暂无评论...
验证码 换一张
取 消