This blog post demonstrates how to add a common header layout in all our Android Activities using simple Parent-Child Relationship.
Note : you can add Fragments as well in the container i am using in the parent class to have one activity and multiple fragments as per your app architecture.
My use case was to implement a common header in an existing project with 50+ activities which shows a to line header with a message whether a user is online or offline without changing to much in the existing code.
My use case was to implement a common header in an existing project with 50+ activities which shows a to line header with a message whether a user is online or offline without changing to much in the existing code.
1. BaseActivity.java
package kamal.com.headtest;
3. activity_main.xml
4. childlayout.xml
5. manifest.xml
package kamal.com.headtest;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class BaseActivity extends AppCompatActivity {
private TextView tvHeader,tvClose;
private FrameLayout activityContainer;
private RelativeLayout rlHeaderView;
@Override
public void setContentView(int layoutResID) {
LinearLayout llparentView = (LinearLayout) getLayoutInflater().inflate(R.layout.activity_main, null);
initViews(llparentView);
getLayoutInflater().inflate(layoutResID, activityContainer, true);
super.setContentView(llparentView);
}
/**
* Initialize BaseActivity Views
* @param view : parent use to initialize child views
*/
private void initViews(View view){
tvHeader=(TextView)view.findViewById(R.id.headertext);
tvClose=(TextView)view.findViewById(R.id.closebtn);
activityContainer = (FrameLayout) view.findViewById(R.id.activity_content);
rlHeaderView=(RelativeLayout)view.findViewById(R.id.headerviewrl);
tvClose.setOnClickListener(closeBtnListener);
}
/**
* anonymous onclicklistener to handle a click event for Close button in header.
*/
private View.OnClickListener closeBtnListener=new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
};
/**
* Method to be overiden by child classes if need to hide header view
* @param show : true or false as to handle visibility of the header
*/
public void showHeader(boolean show){
rlHeaderView.setVisibility(show ? View.VISIBLE : View.GONE);
}
/**
* Method to be overiden by child classes if need to hide header view
* @param value : of the header
*/
public void setHeaderText(String value){
tvHeader.setText(value);
}
}
2. ChildActivity.javapackage kamal.com.headtest;
import android.os.Bundle;
import android.support.annotation.Nullable;
public class ChildActivity extends BaseActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.childlayout);
showHeader(true);;
}
}
3. activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parent_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:id="@+id/headerviewrl" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="?actionBarSize"> <TextView android:id="@+id/headertext" android:layout_width="wrap_content" android:layout_height="?actionBarSize" android:layout_centerHorizontal="true" android:gravity="center" android:padding="10dp" android:textSize="20sp" android:textStyle="bold" android:text="My Header View" /> <TextView android:id="@+id/closebtn" android:layout_width="wrap_content" android:layout_height="?actionBarSize" android:gravity="center" android:padding="10dp" android:textSize="30sp" android:textStyle="bold" android:layout_alignParentRight="true" android:text="X" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#000000" /> <FrameLayout android:id="@+id/activity_content" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
4. childlayout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:text="Testing child" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:text="Testing child" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:text="Testing child" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:text="Testing child" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_marginTop="10dp" android:layout_centerHorizontal="true" android:text="Testing child" /> </LinearLayout>
5. manifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kamal.com.headtest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".ChildActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

No comments:
Post a Comment