Common Clickable Header for All Activities in Android

后端 未结 2 2050
面向向阳花
面向向阳花 2020-12-09 13:13

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

相关标签:
2条回答
  • 2020-12-09 13:35

    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 讨论(0)
  • 2020-12-09 13:37

    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.

    0 讨论(0)
提交回复
热议问题