本讲内容:自定义标题栏控件
下面是HeaderLayout.java自定义头部布局文件:
/**
* 自定义头部控件
*/
public class HeaderLayout extends LinearLayout {
private LayoutInflater mInflater;
private View mHeader;
// HeaderView控件左侧容器
private LinearLayout mLayoutLeftContainer;
// HeaderView控件右侧容器
private LinearLayout mLayoutRightContainer;
// 标题
private TextView mHtvSubTitle;
// 右侧按钮布局
private LinearLayout mLayoutRightImageButtonLayout;
// 右侧按钮
private Button mRightImageButton;
// 右侧按钮监听接口
public onRightImageButtonClickListener mRightImageButtonClickListener;
// 左侧按钮布局
private LinearLayout mLayoutLeftImageButtonLayout;
// 左侧按钮
private ImageButton mLeftImageButton;
// 左侧按钮监听接口
public onLeftImageButtonClickListener mLeftImageButtonClickListener;
// 头部整体样式
public enum HeaderStyle {
DEFAULT_TITLE, TITLE_LIFT_IMAGEBUTTON, TITLE_RIGHT_IMAGEBUTTON, TITLE_DOUBLE_IMAGEBUTTON;
}
/**
* 设置右侧按钮监听接口
*/
public interface onRightImageButtonClickListener {
void onClick();
}
public void setOnRightImageButtonClickListener(
onRightImageButtonClickListener listener) {
this.mRightImageButtonClickListener = listener;
}
/**
* 设置左侧按钮监听接口
*/
public interface onLeftImageButtonClickListener {
void onClick();
}
public void setOnLeftImageButtonClickListener(
onLeftImageButtonClickListener listener) {
this.mLeftImageButtonClickListener = listener;
}
public HeaderLayout(Context context) {
super(context);
init(context);
}
public HeaderLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
/**
* 实现初始化,加载布局文件
*/
public void init(Context context) {
mInflater = LayoutInflater.from(context);
mHeader = mInflater.inflate(R.layout.common_header, null);
addView(mHeader);
initViews();
}
/**
* 初始化控件
*/
private void initViews() {
mLayoutLeftContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_leftview_container);
// mLayoutMiddleContainer = (LinearLayout)
// findViewByHeaderId(R.id.header_layout_middleview_container);中间部分添加搜索或者其他按钮时可打开
mLayoutRightContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_rightview_container);
mHtvSubTitle = (TextView) findViewByHeaderId(R.id.header_htv_subtitle);
}
public View findViewByHeaderId(int id) {
return mHeader.findViewById(id);
}
/**
* 设置控件样式
*/
public void setStyle(HeaderStyle hStyle) {
switch (hStyle) {
case DEFAULT_TITLE:
defaultTitle();
break;
case TITLE_LIFT_IMAGEBUTTON:
defaultTitle();
titleLeftImageButton();
break;
case TITLE_RIGHT_IMAGEBUTTON:
defaultTitle();
titleRightImageButton();
break;
case TITLE_DOUBLE_IMAGEBUTTON:
defaultTitle();
titleLeftImageButton();
titleRightImageButton();
break;
}
}
/**
* 默认文字标题
*/
private void defaultTitle() {
mLayoutLeftContainer.removeAllViews();
mLayoutRightContainer.removeAllViews();
}
/**
* 自定义左侧按钮
*/
private void titleLeftImageButton() {
View mleftImageButtonView = mInflater.inflate(
R.layout.common_header_leftbutton, null);
mLayoutLeftContainer.addView(mleftImageButtonView);
mLayoutLeftImageButtonLayout = (LinearLayout) mleftImageButtonView
.findViewById(R.id.header_layout_imagebuttonlayout);
mLeftImageButton = (ImageButton) mleftImageButtonView
.findViewById(R.id.header_leftbutton);
mLayoutLeftImageButtonLayout.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (mLeftImageButtonClickListener != null) {
// 回调方法,调用onLeftImageButtonClickListener接口实现类的方法
mLeftImageButtonClickListener.onClick();
}
}
});
}
/**
* 自定义右侧按钮
*/
private void titleRightImageButton() {
View mRightImageButtonView = mInflater.inflate(
R.layout.common_header_rightbutton, null);
mLayoutRightContainer.addView(mRightImageButtonView);
mLayoutRightImageButtonLayout = (LinearLayout) mRightImageButtonView
.findViewById(R.id.header_layout_imagebuttonlayout);
mRightImageButton = (Button) mRightImageButtonView
.findViewById(R.id.header_rightbutton);
mLayoutRightImageButtonLayout.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (mRightImageButtonClickListener != null) {
// 回调方法,调用onRightImageButtonClickListener接口实现类的方法
mRightImageButtonClickListener.onClick();
}
}
});
}
/**
* 获取右边按钮
*/
public Button getRightImageButton() {
if (mRightImageButton != null) {
return mRightImageButton;
}
return null;
}
/**
* 设置标题
*
* @param title
*/
public void setDefaultTitle(CharSequence title) {
if (title != null) {
mHtvSubTitle.setText(title);
} else {
mHtvSubTitle.setVisibility(View.GONE);
}
}
/**
* 设置右侧按钮侦听接的实现类,还包括了标题文本、按钮图片
*
* @param title
* @param id
* @param text
* @param listener
*/
public void setTitleAndRightImageButton(CharSequence title, int id,
String text, onRightImageButtonClickListener listener) {
setDefaultTitle(title);
if (mRightImageButton != null) {
mRightImageButton.setWidth(PixelUtil.dp2px(30));
mRightImageButton.setHeight(PixelUtil.dp2px(30));
mRightImageButton.setTextColor(getResources().getColor(
R.color.transparent));
mRightImageButton.setBackgroundResource(id);
setOnRightImageButtonClickListener(listener);
}
mLayoutRightContainer.setVisibility(View.VISIBLE);
}
public void setTitleAndRightImageButton(CharSequence title, int backid,
onRightImageButtonClickListener onRightImageButtonClickListener) {
setDefaultTitle(title);
mLayoutRightContainer.setVisibility(View.VISIBLE);
if (mRightImageButton != null && backid > 0) {
mRightImageButton.setWidth(PixelUtil.dp2px(30));
mRightImageButton.setHeight(PixelUtil.dp2px(30));
mRightImageButton.setTextColor(getResources().getColor(
R.color.transparent));
mRightImageButton.setBackgroundResource(backid);
setOnRightImageButtonClickListener(onRightImageButtonClickListener);
}
}
/**
* 设置左侧按钮侦听接的实现类,还包括了标题文本、按钮图片
*
* @param title
* @param id
* @param listener
*/
public void setTitleAndLeftImageButton(CharSequence title, int id,
onLeftImageButtonClickListener listener) {
setDefaultTitle(title);
if (mLeftImageButton != null && id > 0) {
mLeftImageButton.setImageResource(id);
setOnLeftImageButtonClickListener(listener);
}
mLayoutRightContainer.setVisibility(View.INVISIBLE);
}
}
下面是res/layout/common_header.xml 布局文件:(HeaderLayout自定义头部控件布局文件)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/ActionBar"
android:baselineAligned="false"
android:focusable="true" >
<LinearLayout
android:id="@+id/header_layout_leftview_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:gravity="center_vertical|left"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/header_layout_middleview_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/header_htv_subtitle"
style="@style/ActionBarTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/header_layout_rightview_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:gravity="center_vertical|right"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
<style name="ActionBar">
<item name="android:orientation">horizontal</item>
<item name="android:background">@drawable/top_bar</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:gravity">center_vertical</item>
<item name="android:layout_height">@dimen/base_action_bar_height</item>
</style>
<style name="ActionBarTitle">
<item name="android:textSize">@dimen/base_action_bar_title_size</item>
<item name="android:textColor">@color/white</item>
<item name="android:gravity">left|center</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:singleLine">true</item>
<item name="android:drawablePadding">1.0dip</item>
</style>
下面是res/layout/common_header_leftbutton.xml 布局文件:(左边按钮布局 )
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/header_layout_imagebuttonlayout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:minWidth="54dip"
android:padding="6dip" >
<ImageButton
android:id="@+id/header_leftbutton"
android:layout_width="30dip"
android:layout_height="30dip"
android:background="#00000000"
android:clickable="false"
android:contentDescription="@string/app_name"
android:focusable="false"
android:scaleType="centerInside" />
</LinearLayout>
下面是res/layout/common_header_rightbutton.xml 布局文件:(右边按钮布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/header_layout_imagebuttonlayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:padding="6dip" >
<Button
android:id="@+id/header_rightbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:contentDescription="@string/app_name"
android:focusable="false"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:textColor="@color/white" />
</LinearLayout>
下面是res/layout/include_action_bar.xml 布局文件:(方便调用)
<?xml version="1.0" encoding="utf-8"?>
<com.imdemo.view.HeaderLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/base_action_bar_height" >
</com.imdemo.view.HeaderLayout>
下面是res/layout/fragment_recent.xml 布局文件:(fragment_contract.xml和fragment_set.xml 相同 )
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<include
android:id="@+id/common_actionbar"
layout="@layout/include_action_bar" />
</LinearLayout>
下面是BaseFragment.java文件
/**
* Fragment 基类
*/
public class BaseFragment extends Fragment {
public static final String TAG = "tag";
// 公用的Header布局
private HeaderLayout mHeaderLayout;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public BaseFragment() {
}
/**
* 打印toast
*/
Toast mToast;
public void ShowToast(final String text) {
if (mToast == null) {
mToast = Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT);
} else {
mToast.setText(text);
}
mToast.show();
}
public void ShowToast(final int resId) {
if (mToast == null) {
mToast = Toast.makeText(getActivity(), resId, Toast.LENGTH_LONG);
} else {
mToast.setText(resId);
}
mToast.show();
}
/**
* 打印log
*/
public void ShowLog(String msg) {
Log.i("TAG", msg);
}
public View findViewById(int ParamInt) {
return getView().findViewById(ParamInt);
}
public CustomApplication mApplication;
/**
* 只有标题
*/
public void initTopBarForOnlyTitle(String titleName) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.DEFAULT_TITLE);
mHeaderLayout.setDefaultTitle(titleName);
}
/**
* 初始化标题栏-带左右按钮
*/
public void initTopBarForBoth(String titleName, int rightDrawableId,
String text, onRightImageButtonClickListener listener) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
mHeaderLayout.setTitleAndLeftImageButton(titleName,
R.drawable.base_action_bar_back_bg_selector,
new OnLeftButtonClickListener());
mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
text, listener);
}
/**
* 只有左边按钮和Title
*/
public void initTopBarForLeft(String titleName) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
mHeaderLayout.setTitleAndLeftImageButton(titleName,
R.drawable.base_action_bar_back_bg_selector,
new OnLeftButtonClickListener());
}
/**
* 右边+title
*/
public void initTopBarForRight(String titleName, int rightDrawableId,
onRightImageButtonClickListener listener) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_RIGHT_IMAGEBUTTON);
mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
listener);
}
/**
* 左边按钮的点击事件
*/
public class OnLeftButtonClickListener implements
onLeftImageButtonClickListener {
public void onClick() {
getActivity().finish();
}
}
/**
* 动画启动页面 startAnimActivity
*/
public void startAnimActivity(Intent intent) {
this.startActivity(intent);
}
public void startAnimActivity(Class<?> cla) {
getActivity().startActivity(new Intent(getActivity(), cla));
}
}
下面是RecentFragment.java文件
public class RecentFragment extends BaseFragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_recent, container, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initVews();
}
private void initVews() {
initTopBarForOnlyTitle("会话");
}
}
下面是ContactFragment.java文件
/**
* 联系人
*/
public class ContactFragment extends BaseFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_contacts, container, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initVews();
}
private void initVews() {
initTopBarForRight("联系人", R.drawable.base_action_bar_add_bg_selector, new onRightImageButtonClickListener() {
public void onClick() {
ShowToast("你点击了添加好友");
}
});
}
}
下面是SettingsFragment.java文件
public class SettingsFragment extends BaseFragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_set, container, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initVews();
}
private void initVews() {
initTopBarForOnlyTitle("设置");
}
}
下面是BaseActivity.java文件
/**
* Activity 基类
*/
public class BaseActivity extends Activity {
public static final String TAG = "tag";
// 公用的Header布局
private HeaderLayout mHeaderLayout;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 打印toast
*/
Toast mToast;
public void ShowToast(final String text) {
if (!TextUtils.isEmpty(text)) {
runOnUiThread(new Runnable() {
public void run() {
if (mToast == null) {
mToast = Toast.makeText(getApplicationContext(), text,
Toast.LENGTH_LONG);
} else {
mToast.setText(text);
}
mToast.show();
}
});
}
}
public void ShowToast(final int resId) {
runOnUiThread(new Runnable() {
public void run() {
if (mToast == null) {
mToast = Toast.makeText(
BaseActivity.this.getApplicationContext(), resId,
Toast.LENGTH_LONG);
} else {
mToast.setText(resId);
}
mToast.show();
}
});
}
/**
* 打印log
*/
public void ShowLog(String msg) {
Log.i("TAG", msg);
}
/**
* 动画启动页面
*/
public void startAnimActivity(Class<?> cla) {
this.startActivity(new Intent(this, cla));
}
public void startAnimActivity(Intent intent) {
this.startActivity(intent);
}
/**
* 只有标题
*/
public void initTopBarForOnlyTitle(String titleName) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.DEFAULT_TITLE);
mHeaderLayout.setDefaultTitle(titleName);
}
/**
* 初始化标题栏-带左右按钮
*/
public void initTopBarForBoth(String titleName, int rightDrawableId,
String text, onRightImageButtonClickListener listener) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
mHeaderLayout.setTitleAndLeftImageButton(titleName,
R.drawable.base_action_bar_back_bg_selector,
new OnLeftButtonClickListener());
mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
text, listener);
}
/**
* 右边+title
*/
public void initTopBarForRight(String titleName, int rightDrawableId,
onRightImageButtonClickListener listener) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_RIGHT_IMAGEBUTTON);
mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
listener);
}
/**
* 只有左边按钮和Title
*/
public void initTopBarForLeft(String titleName) {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mHeaderLayout.setStyle(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
mHeaderLayout.setTitleAndLeftImageButton(titleName,
R.drawable.base_action_bar_back_bg_selector,
new OnLeftButtonClickListener());
}
/**
* 左边按钮的点击事件
*/
public class OnLeftButtonClickListener implements
onLeftImageButtonClickListener {
public void onClick() {
finish();
}
}
}
下面是MainActivity.java主界面文件:
public class MainActivity extends FragmentActivity {
private Button[] mTabs;
private ContactFragment contactFragment;
private RecentFragment recentFragment;
private SettingsFragment settingFragment;
private Fragment[] fragments;
private int index;
private int currentTabIndex;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initTab();
}
private void initViews() {
mTabs = new Button[3];
mTabs[0] = (Button) findViewById(R.id.id_message);
mTabs[1] = (Button) findViewById(R.id.id_contract);
mTabs[2] = (Button) findViewById(R.id.id_set);
// 把第一个tab设为选中状态
mTabs[0].setSelected(true);
}
private void initTab() {
recentFragment = new RecentFragment();
contactFragment = new ContactFragment();
settingFragment = new SettingsFragment();
setSelect(recentFragment);
}
public void onTabSelect(View view) {
switch (view.getId()) {
case R.id.id_message:
if (currentTabIndex != 0) {
setSelect(recentFragment);
mTabs[currentTabIndex].setSelected(false);
mTabs[0].setSelected(true);
}
index = 0;
break;
case R.id.id_contract:
if (currentTabIndex != 1) {
setSelect(contactFragment);
mTabs[currentTabIndex].setSelected(false);
mTabs[1].setSelected(true);
}
index = 1;
break;
case R.id.id_set:
if (currentTabIndex != 2) {
setSelect(settingFragment);
mTabs[currentTabIndex].setSelected(false);
mTabs[2].setSelected(true);
}
index = 2;
break;
}
currentTabIndex = index;
}
/**
* 选择页卡
*/
private void setSelect(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.id_fragment_container, fragment);
transaction.commit();
}
}