千里之行,始于足下(二)-------创建基类

本文介绍了构建Android应用程序的基础框架,包括BaseActivity和BaseBarActivity两个核心类。BaseActivity作为所有Activity的基类,实现了基本的功能;BaseBarActivity则进一步提供了一个带有自定义标题栏的通用基类。此外,还详细介绍了自定义标题栏组件HeaderLayout的设计与实现。

前一篇我们已经把jar包导入项目,并配置好项目文件。今天我们就把基础框架搭一下,之后所有的Activity类都将继承这些基类。
1、BaseActivity,继承Activity。所有Activity的基类。

package com.mtwy.tracksite.activity;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.widget.Toast;
import cn.bmob.im.BmobChatManager;
import cn.bmob.im.BmobUserManager;
import cn.bmob.im.bean.BmobChatUser;
import cn.bmob.im.config.BmobConfig;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;

import com.mtwy.tracksite.activity.bmob.LoginActivity;
import com.mtwy.tracksite.application.MyApplication;
import com.mtwy.tracksite.bean.User;
import com.mtwy.tracksite.dialog.DialogTips;
import com.mtwy.tracksite.util.CollectionUtils;

/**
 * 所有Activty的基类
 * 
 * @author Administrator
 * 
 */
public class BaseActivity extends Activity {

    protected BmobUserManager userManager;
    protected BmobChatManager manager;

    protected MyApplication mApplication;

    protected int mScreenWidth;
    protected int mScreenHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        // 用户管理类--所有和用户有关的操作均使用此类:
        // 登陆、退出、获取好友列表、获取当前登陆用户、删除好友、添加好友等
        userManager = BmobUserManager.getInstance(this);
        // 聊天管理-用于管理聊天:包括发送(聊天消息、Tag消息)、保存消息、绑定用户等
        manager = BmobChatManager.getInstance(this);
        //自定义application
        mApplication = MyApplication.getInstance();
        //获取屏幕高宽
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        mScreenWidth = metric.widthPixels;
        mScreenHeight = metric.heightPixels;
    }

    Toast mToast;
    /** 显示Toast */
    public void ShowToast(final String text) {
        if (!TextUtils.isEmpty(text)) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    if (mToast == null) {
                        mToast = Toast.makeText(getApplicationContext(), text,
                                Toast.LENGTH_LONG);
                    } else {
                        mToast.setText(text);
                    }
                    mToast.show();
                }
            });

        }
    }

    /** 显示Toast */
    public void ShowToast(final int resId) {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                if (mToast == null) {
                    mToast = Toast.makeText(
                            BaseActivity.this.getApplicationContext(), resId,
                            Toast.LENGTH_LONG);
                } else {
                    mToast.setText(resId);
                }
                mToast.show();
            }
        });
    }

    /**
     * 打Log ShowLog
     * 
     * @return void
     * @throws
     */
    public void ShowLog(String msg) {
        Log.i("life", msg);
    }

    public void startAnimActivity(Class<?> cla) {
        this.startActivity(new Intent(this, cla));
    }

    public void startAnimActivity(Intent intent) {
        this.startActivity(intent);
    }

    /**
     * 显示下线的对话框 showOfflineDialog
     * 
     * @return void
     * @throws
     */
    public void showOfflineDialog(final Context context) {
        DialogTips dialog = new DialogTips(this, "您的账号已在其他设备上登录!", "重新登录");
        // 设置成功事件
        dialog.SetOnSuccessListener(new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int userId) {
                MyApplication.getInstance().logout();
                startActivity(new Intent(context, LoginActivity.class));
                finish();
                dialogInterface.dismiss();
            }
        });
        // 显示确认对话框
        dialog.show();
        dialog = null;
    }

    /**
     * 用于登陆或者自动登陆情况下的用户资料及好友资料的检测更新
     * 
     * @Title: updateUserInfos
     * @Description: TODO
     * @param
     * @return void
     * @throws
     */
    public void updateUserInfos() {
        // 更新地理位置信息
        updateUserLocation();
        // 查询该用户的好友列表(这个好友列表是去除黑名单用户的哦),目前支持的查询好友个数为100,如需修改请在调用这个方法前设置BmobConfig.LIMIT_CONTACTS即可。
        // 这里默认采取的是登陆成功之后即将好于列表存储到数据库中,并更新到当前内存中,
        userManager.queryCurrentContactList(new FindListener<BmobChatUser>() {

            @Override
            public void onError(int arg0, String arg1) {
                // TODO Auto-generated method stub
                if (arg0 == BmobConfig.CODE_COMMON_NONE) {
                    ShowLog(arg1);
                } else {
                    ShowLog("查询好友列表失败:" + arg1);
                }
            }

            @Override
            public void onSuccess(List<BmobChatUser> arg0) {
                // TODO Auto-generated method stub
                // 保存到application中方便比较
                MyApplication.getInstance().setContactList(
                        CollectionUtils.list2map(arg0));
            }
        });
    }

    /**
     * 更新用户的经纬度信息
     * 
     * @Title: uploadLocation
     * @Description: TODO
     * @param
     * @return void
     * @throws
     */
    public void updateUserLocation() {
        if (MyApplication.lastPoint != null) {
            String saveLatitude = mApplication.getLatitude();
            String saveLongtitude = mApplication.getLongtitude();
            String newLat = String.valueOf(MyApplication.lastPoint
                    .getLatitude());
            String newLong = String.valueOf(MyApplication.lastPoint
                    .getLongitude());
            // ShowLog("saveLatitude ="+saveLatitude+",saveLongtitude = "+saveLongtitude);
            // ShowLog("newLat ="+newLat+",newLong = "+newLong);
            if (!saveLatitude.equals(newLat) || !saveLongtitude.equals(newLong)) {// 只有位置有变化就更新当前位置,达到实时更新的目的
                //获取当前登录的用户
                User u = (User) userManager.getCurrentUser(User.class);
                final User user = new User();
                user.setLocation(MyApplication.lastPoint);
                user.setObjectId(u.getObjectId());
                //更新用户信息
                user.update(this, new UpdateListener() {
                    @Override
                    public void onSuccess() {
                        // TODO Auto-generated method stub
                        MyApplication.getInstance()
                                .setLatitude(
                                        String.valueOf(user.getLocation()
                                                .getLatitude()));
                        MyApplication.getInstance().setLongtitude(
                                String.valueOf(user.getLocation()
                                        .getLongitude()));
                        // ShowLog("经纬度更新成功");
                    }

                    @Override
                    public void onFailure(int code, String msg) {
                        // TODO Auto-generated method stub
                        // ShowLog("经纬度更新 失败:"+msg);
                    }
                });
            } else {
                // ShowLog("用户位置未发生过变化");
            }
        }
    }
}

2、BaseBarActivity,继承BaseActivity。所有带标题栏的基类。

package com.mtwy.tracksite.activity;

import android.app.Activity;
import android.content.Intent;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;

import com.mtwy.tracksite.myview.HeaderLayout;
import com.mtwy.tracksite.myview.HeaderLayout.HeaderStyle;
import com.mtwy.tracksite.myview.HeaderLayout.OnDriveImageButtonClickListener;
import com.mtwy.tracksite.myview.HeaderLayout.OnTransitImageButtonClickListener;
import com.mtwy.tracksite.myview.HeaderLayout.OnWalkImageButtonClickListener;
import com.mtwy.tracksite.myview.HeaderLayout.onLeftImageButtonClickListener;
import com.mtwy.tracksite.myview.HeaderLayout.onRightImageButtonClickListener;

public class BaseBarActivity extends BaseActivity {

    protected HeaderLayout mHeaderLayout;

    /**
     * 只有title initTopBarLayoutByTitle
     * 
     * @Title: initTopBarLayoutByTitle
     * @throws
     */
    public void initTopBarForOnlyTitle(String titleName) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.DEFAULT_TITLE);
        mHeaderLayout.setDefaultTitle(titleName);
    }

    /**
     * 只有标题和右侧按钮
     * 
     * @param titleName
     * @param rightDrawableId
     * @param listener
     */
    public void initTopBarForRight(String titleName, int rightDrawableId,
            onRightImageButtonClickListener listener) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.TITLE_RIGHT_IMAGEBUTTON);
        // mHeaderLayout.setTitleAndLeftImageButton(titleName,
        // R.drawable.base_action_bar_back_bg_selector,
        // new OnLeftButtonClickListener());
        mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
                listener);
    }

    /**
     * 初始化标题栏-带左右按钮
     * 
     * @return void
     * @throws
     */
    public void initTopBarForBoth(String titleName, int rightDrawableId,
            String text, onRightImageButtonClickListener listener) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
        mHeaderLayout.setTitleAndLeftImageButton(titleName,
                R.drawable.base_action_bar_back_bg_selector,
                new OnLeftButtonClickListener());
        mHeaderLayout.setTitleAndRightButton(titleName, rightDrawableId, text,
                listener);
    }

    public void initTopBarForBoth(String titleName, int rightDrawableId,
            onRightImageButtonClickListener listener) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);
        mHeaderLayout.setTitleAndLeftImageButton(titleName,
                R.drawable.base_action_bar_back_bg_selector,
                new OnLeftButtonClickListener());
        mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,
                listener);
    }

    public void initTopBarForRoute(onRightImageButtonClickListener listener,
            OnTransitImageButtonClickListener tListener,
            OnDriveImageButtonClickListener dListener,
            OnWalkImageButtonClickListener wListener) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.TITLE_MAP_ROUTE_PLAN);
        // 左侧按钮
        mHeaderLayout.setTitleAndLeftImageButton("",
                R.drawable.base_action_bar_back_bg_selector,
                new OnLeftButtonClickListener());
        // 右侧按钮
        mHeaderLayout.setTitleAndRightImageButton("",
                R.drawable.base_action_bar_search_bg_selector, listener);
        mHeaderLayout.setOnTransitImageButtonClickListener(tListener);
        mHeaderLayout.setOnDriveImageButtonClickListener(dListener);
        mHeaderLayout.setOnWalkImageButtonClickListener(wListener);
    }

    /**
     * 只有左边按钮和Title initTopBarLayout
     * @param titleName
     */
    public void initTopBarForLeft(String titleName) {
        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
        mHeaderLayout.init(HeaderStyle.TITLE_LIFT_IMAGEBUTTON);
        mHeaderLayout.setTitleAndLeftImageButton(titleName,
                R.drawable.base_action_bar_back_bg_selector,
                new OnLeftButtonClickListener());
    }

    // 左边按钮的点击事件
    public class OnLeftButtonClickListener implements
            onLeftImageButtonClickListener {

        @Override
        public void onClick() {
            finish();
        }
    }

    /** 跳转Activity */
    public void startAnimActivity(Class<?> cla) {
        this.startActivity(new Intent(this, cla));
    }

    /** 跳转Activity */
    public void startAnimActivity(Intent intent) {
        this.startActivity(intent);
    }

    /**
     * 隐藏软键盘 hideSoftInputView
     * 
     * @Title: hideSoftInputView
     * @Description: TODO
     * @param
     * @return void
     * @throws
     */
    public void hideSoftInputView() {
        InputMethodManager manager = ((InputMethodManager) this
                .getSystemService(Activity.INPUT_METHOD_SERVICE));
        if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
            if (getCurrentFocus() != null)
                manager.hideSoftInputFromWindow(getCurrentFocus()
                        .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

}

在BaseBarActivity类中用到了一个自定义标题栏布局,代码如下

package com.mtwy.tracksite.myview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.mtwy.tracksite.activity.R;
import com.mtwy.tracksite.util.PixelUtil;

/**
 * 自定义头部布局
 * 
 * @ClassName: HeaderLayout
 * @Description: TODO
 * @author smile
 * @date 2014-5-19 下午2:30:30
 */
@SuppressLint("InflateParams")
public class HeaderLayout extends LinearLayout {
    private LayoutInflater mInflater;
    private View mHeader;
    private LinearLayout mLayoutLeftContainer;
    private LinearLayout mLayoutRightContainer;
    private TextView mHtvSubTitle;
    private LinearLayout mLayoutRightImageButtonLayout;
    private Button mRightImageButton;
    private onRightImageButtonClickListener mRightImageButtonClickListener;

    private LinearLayout mLayoutLeftImageButtonLayout;
    private ImageButton mLeftImageButton;
    private onLeftImageButtonClickListener mLeftImageButtonClickListener;

    private LinearLayout mLayoutMiddleContainer;
    private OnTransitImageButtonClickListener mOnTransitImageButtonClickListener;
    private OnDriveImageButtonClickListener mOnDriveImageButtonClickListener;
    private OnWalkImageButtonClickListener mOnWalkImageButtonClickListener;
    private ImageButton mTransitImageButton, mDriverImageButton,
            mWalkImageButton;

    public enum HeaderStyle {// 头部整体样式
        TITLE_MAP_ROUTE_PLAN, // 地图路线头部样式
        DEFAULT_TITLE, TITLE_LIFT_IMAGEBUTTON, TITLE_RIGHT_IMAGEBUTTON, TITLE_DOUBLE_IMAGEBUTTON;
    }

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

    public 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 init(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;
        case TITLE_MAP_ROUTE_PLAN:
            defaultTitle();
            titleLeftImageButton();
            titleMiddleImageButton();
            titleRightImageButton();
            break;
        }
    }

    /**设置中间布局内容*/
    private void titleMiddleImageButton() {
        View mMiddleImageButtonView = mInflater.inflate(
                R.layout.common_header_middle, null);
        mLayoutMiddleContainer.addView(mMiddleImageButtonView);
        mTransitImageButton = (ImageButton) mMiddleImageButtonView
                .findViewById(R.id.header_middle_transitimagebutton);
        mDriverImageButton = (ImageButton) mMiddleImageButtonView
                .findViewById(R.id.header_middle_driverimagebutton);
        mWalkImageButton = (ImageButton) mMiddleImageButtonView
                .findViewById(R.id.header_middle_walkimagebutton);
        mTransitImageButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if(mOnTransitImageButtonClickListener != null){
                    mOnTransitImageButtonClickListener.onClick();
                }
            }
        });
        mDriverImageButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if(mOnDriveImageButtonClickListener != null){
                    mOnDriveImageButtonClickListener.onClick();
                }
            }
        });
        mWalkImageButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if(mOnWalkImageButtonClickListener != null){
                    mOnWalkImageButtonClickListener.onClick();
                }
            }
        });
    }

    // 默认文字标题
    private void defaultTitle() {
        mLayoutLeftContainer.removeAllViews();
        mLayoutRightContainer.removeAllViews();
    }

    // 左侧自定义按钮
    private void titleLeftImageButton() {
        View mleftImageButtonView = mInflater.inflate(
                R.layout.common_header_button, null);
        mLayoutLeftContainer.addView(mleftImageButtonView);
        mLayoutLeftImageButtonLayout = (LinearLayout) mleftImageButtonView
                .findViewById(R.id.header_layout_middlelayout);
        mLeftImageButton = (ImageButton) mleftImageButtonView
                .findViewById(R.id.header_middle_leftimagebutton);
        mLayoutLeftImageButtonLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (mLeftImageButtonClickListener != null) {
                    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_middlelayout);
        mRightImageButton = (Button) mRightImageButtonView
                .findViewById(R.id.header_middle_leftimagebutton);
        mLayoutRightImageButtonLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (mRightImageButtonClickListener != null) {
                    mRightImageButtonClickListener.onClick();
                }
            }
        });
    }

    /**
     * 获取右边按钮
     * 
     * @Title: getRightImageButton
     * @Description: TODO
     * @param @return
     * @return Button
     * @throws
     */
    public Button getRightImageButton() {
        if (mRightImageButton != null) {
            return mRightImageButton;
        }
        return null;
    }

    /**设置标题*/
    public void setDefaultTitle(CharSequence title) {
        if (title != null) {
            mHtvSubTitle.setText(title);
        } else {
            mHtvSubTitle.setVisibility(View.GONE);
        }
    }

    /**设置标题与右侧带文字按钮*/
    public void setTitleAndRightButton(CharSequence title, int backid,
            String text,
            onRightImageButtonClickListener onRightImageButtonClickListener) {
        setDefaultTitle(title);
        mLayoutRightContainer.setVisibility(View.VISIBLE);
        if (mRightImageButton != null && backid > 0) {
            mRightImageButton.setWidth(PixelUtil.dp2px(45));
            mRightImageButton.setHeight(PixelUtil.dp2px(40));
            mRightImageButton.setBackgroundResource(backid);
            mRightImageButton.setText(text);
            setOnRightImageButtonClickListener(onRightImageButtonClickListener);
        }
    }

    /**设置标题与右侧图片按钮*/
    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);
        }
    }

    /**设置标题与左侧按钮*/
    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);
    }

    /**设置地图路线按钮*/
    public void setRouteImageButton(){
        setDefaultTitle(null);
        if (mTransitImageButton != null) {
            mRightImageButton.setBackgroundResource(R.drawable.button_transit);
        }
        if (mDriverImageButton != null) {
            mDriverImageButton.setBackgroundResource(R.drawable.button_driver);
        }
        if (mWalkImageButton != null) {
            mWalkImageButton.setBackgroundResource(R.drawable.button_walk);
        }
    }

    /**设置右侧按钮点击事件*/
    public void setOnRightImageButtonClickListener(
            onRightImageButtonClickListener listener) {
        mRightImageButtonClickListener = listener;
    }

    /**右侧按钮点击事件接口*/
    public interface onRightImageButtonClickListener {
        void onClick();
    }

    public void setOnLeftImageButtonClickListener(
            onLeftImageButtonClickListener listener) {
        mLeftImageButtonClickListener = listener;
    }

    /**左侧按钮点击事件接口*/
    public interface onLeftImageButtonClickListener {
        void onClick();
    }

    /**公交路线按钮接口*/
    public interface OnTransitImageButtonClickListener {
        public void onClick();
    }

    /**自驾路线按钮接口*/
    public interface OnDriveImageButtonClickListener {
        public void onClick();
    }

    /**步行路线按钮接口*/
    public interface OnWalkImageButtonClickListener {
        public void onClick();
    }

    /**设置公交路线按钮点击事件*/
    public void setOnTransitImageButtonClickListener(
            OnTransitImageButtonClickListener onTransitImageButtonClickListener) {
        mOnTransitImageButtonClickListener = onTransitImageButtonClickListener;
    }

    /**设置自驾路线按钮点击事件*/
    public void setOnDriveImageButtonClickListener(
            OnDriveImageButtonClickListener onDriveImageButtonClickListener) {
        mOnDriveImageButtonClickListener = onDriveImageButtonClickListener;
    }

    /**设置步行路线按钮点击事件*/
    public void setOnWalkImageButtonClickListener(
            OnWalkImageButtonClickListener onWalkImageButtonClickListener) {
        mOnWalkImageButtonClickListener = onWalkImageButtonClickListener;
    }
}

布局文件源码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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="fill_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="fill_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="fill_parent"
        android:layout_alignParentRight="true"
        android:gravity="center_vertical|right"
        android:orientation="horizontal" >
    </LinearLayout>

</RelativeLayout>

今天就到这里,很简单的几个类,但是却是整个项目的基础,接下来继续加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值