自定义标题栏控件

本讲内容:自定义标题栏控件


下面是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();
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值