Android最新控件ActionBar入门浅析

来源:互联网 发布:vb if 编辑:程序博客网 时间:2024/06/05 16:20

上周学校答辩毕业等事比较多,博客停了一周,今天又是周一上班处理的事情比较多,不过还得把上周没总结的总结了,废话不多说,先上代码:

因为现在接触的代码比较多了,所以现在对代码的重用性,耦合性等等比较重视,感觉很重要

还是先看一下目录结构吧,不然下面的代码会看不懂的


博主先定义了一个最最底层的activity:

ABaseActivity

package cn.edu.sjzc.fanyafeng.testlamejni.activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import cn.edu.sjzc.fanyafeng.testlamejni.R;/** * 最底层的基类,配置文件的数据读写 * 若与后台链接,读取用户基本信息等 */public class ABaseActivity extends Activity implements View.OnClickListener {    protected String name;    protected String sex;    protected String qq;    protected String csdn;    protected String age;    protected static View view = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getPropertyFileContent();        getBackgroundView();        view = this.getWindow().getDecorView();   //getDecorView 获得window最顶层的View        view.setBackgroundResource(R.color.custom_background);    }    private void getPropertyFileContent() {        Properties properties = new Properties();        try {            InputStream inputStream = getAssets().open("fanyafeng.properties");            properties.load(inputStream);            name = properties.getProperty("name");            sex = properties.getProperty("sex");            qq = properties.getProperty("qq");            csdn = properties.getProperty("csdn");            age = properties.getProperty("age");        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void onClick(View v) {    }    public static View getBackgroundView() {        return view;    }    @Override    protected void onResume() {        super.onResume();    }}
在这还要着重说一下,我用的是Android Studio,不是Eclipse,有些东西Eclipse完成不了,感觉as打包真的很方便,而且功能很强,下面说一下,关于配置文件,需要结合一下路径,不然不好理解

看一下fanyafeng.properties

#数字,字母,布尔(感觉多此一举)都包括了name=fanyafengsex=manage=24qq=948744852csdn=http://blog.csdn.net/qq_23195583iswork=trueemil=948744852@qq.com
这样的话,就可以动态的定义java代码中的东西了,等用到了就知道他的好处了,真心非常好用,再来看一下清单文件

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cn.edu.sjzc.fanyafeng.testlamejni">    <application        android:allowBackup="true"        android:label="${APP_NAME}"        android:theme="@style/CustomTheme">        <activity            android:name=".activity.MainActivity"            android:label="${APP_NAME}">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name=".activity.SettingActivity"            android:label="@string/title_activity_setting" />        <activity            android:name=".activity.PhotoActivity"            android:allowBackup="true"            android:label="@string/title_activity_photo"            android:theme="@style/CustomTheme" />        <activity            android:name=".activity.ScanActivity"            android:label="@string/title_activity_scan"            android:theme="@style/CustomTheme" />        <activity            android:name=".activity.ChangeThemeActivity"            android:label="@string/title_activity_change_theme" />        <activity            android:name=".activity.TestBaseActivity"            android:label="@string/title_activity_test" />        <activity            android:name=".activity.TestWeChatActivity"            android:label="@string/title_activity_test1" />        <activity            android:name=".activity.TestTitleActivity"            android:label="@string/title_activity_test2" />        <activity            android:name=".activity.TestHideActivity"            android:label="@string/title_activity_test_hide" />        <activity            android:name=".activity.TestCustomActivity"            android:theme="@style/XTheme"            android:label="@string/title_activity_test_custom" />        <activity            android:name=".activity.TestPopWindowActivity"            android:label="@string/title_activity_test_pop_window" />        <activity            android:name=".activity.ChangeBackgroudActivity"            android:label="@string/title_activity_change_backgroud" />    </application></manifest>

相应的theme

<resources>    <style name="noTitle" parent="@android:style/Theme.Light.NoTitleBar">        <!--            Theme customizations available in newer API levels can go in            res/values-vXX/styles.xml, while customizations related to            backward-compatibility can go here.        -->    </style>    <!-- Base application theme. -->    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">        <!-- Customize your theme here. -->    </style>    <!--自定义标题-->    <!-- 将自定义的style取名为CustomTheme,父类为Theme.Holo.Light,也就是说默认背景是白底黑字(如果是Theme.Holo,则默认是黑底白字) -->    <style name="CustomTheme" parent="android:style/Theme.Holo.Light">        <!-- 这是item的背景修改,不按时透明,按时显示绿色  -->        <item name="android:selectableItemBackground">@drawable/ad_selectable_background</item>        <item name="android:actionBarTabStyle">@style/MyActionBarTabStyle</item>        <item name="android:actionBarTabTextStyle">@style/MyActionBarTabTextStyle</item>        <item name="android:actionDropDownStyle">@style/MyDropDownNav</item>        <item name="android:dropDownListViewStyle">@style/MyDropDownListView</item>    </style>    <!-- Tab选项标签的样式 -->    <style name="MyActionBarTabStyle" parent="android:style/Widget.Holo.Light.ActionBar.TabView">        <item name="android:background">@drawable/actionbar_tab_bg</item>        <item name="android:paddingLeft">22dp</item>        <item name="android:paddingRight">22dp</item>    </style>    <!-- Tab选项标签字体的样式 -->    <style name="MyActionBarTabTextStyle" parent="android:style/Widget.Holo.Light.ActionBar.TabText">        <item name="android:textColor">#ff0000</item>        <item name="android:textSize">12sp</item>    </style>    <!-- 下拉导航外部按钮的样式 -->    <style name="MyDropDownNav" parent="android:style/Widget.Holo.Light.Spinner">        <item name="android:background">@drawable/ad_spinner_background_holo_light</item>        <item name="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>        <item name="android:dropDownSelector">@drawable/ad_selectable_background</item>    </style>    <!-- 下拉导航内部按钮的样式 -->    <style name="MyDropDownListView" parent="android:style/Widget.Holo.ListView.DropDown">        <item name="android:listSelector">@drawable/ad_selectable_background</item>    </style>    <!--微信theme样式-->    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">        <item name="android:actionBarStyle">@style/WeChatActionBar</item>        <!--spinner背景颜色-->        <item name="android:itemBackground">@color/gray</item>        <item name="android:actionBarItemBackground">@drawable/actionbar_bg_selector</item>        <item name="android:itemTextAppearance">@style/WeChatActionBarOverflow</item>        <item name="android:actionOverflowButtonStyle">@style/WeChatActionButtonOverflow</item>        <item name="android:dropDownListViewStyle">@style/MyDropDownListView</item>    </style>    <style name="WeChatActionBar" parent="@android:style/Widget.Holo.ActionBar">        <!--actionbar背景色,以及actionbar的字体定义-->        <item name="android:background">#303537</item>        <item name="android:titleTextStyle">@style/WeChatActionBarTitleText</item>    </style>    <style name="WeChatActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">        <!--actionbar中title的字体颜色和大小-->        <item name="android:textColor">#cfcfcf</item>        <item name="android:textSize">17sp</item>    </style>    <style name="WeChatActionBarOverflow" parent="@android:style/Widget.ActionButton.Overflow">        <!--spinner的字体大小-->        <item name="android:textSize">16sp</item>    </style>    <style name="WeChatActionButtonOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">        <!--定义左上角按钮-->        <item name="android:src">@drawable/actionbar_more_icon</item>    </style>    <!--自定义titlebar-->    <style name="XTheme" parent="android:Theme.Light">        <!-- Window attributes -->        <item name="android:windowTitleBackgroundStyle">@style/StatusBarBackground</item>        <item name="android:windowContentOverlay">@null</item>        <item name="android:windowTitleSize">41dp</item>        <item name="android:actionModeBackground">@color/white</item>        <item name="android:backgroundDimAmount">@color/white</item>        <item name="android:backgroundDimEnabled">@color/white</item>        <item name="android:backgroundStacked">@color/white</item>    </style>    <style name="StatusBarBackground">        <item name="android:background">@null</item>    </style></resources>


下面开始着重说actionbar的定义以及使用方法,再来看,博主又定义了两个base,因为并不是所有项目都要求你用actionbar,有的需要自定义,那么这样的话,两个base继承abase,然后根据实际需要再去继承相应的base,这样的话就能满足功能需要了

看一个actionbar的base

package cn.edu.sjzc.fanyafeng.testlamejni.activity;import android.app.ActionBar;import android.app.Activity;import android.content.res.Resources;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import cn.edu.sjzc.fanyafeng.testlamejni.R;/** * 首先声明:actionbar必须是在api 11以上才能使用,如果低于这个版本的话会有提示 * 全英文代码均是新建时生成,未做任何改动 * 首先定义这个base是为了代码的重用性 * 解决相同功能和相同代码的重复编写 * <p/> * 本来想找一下在代码中定制theme的方法,但是没找到,后期找到后会加上 */public class BaseActivity extends ABaseActivity {    //相同的类型可以用一个string的,为了以后的移植都进行了单个的定义    protected String title;    protected String subtitle;    protected boolean ishide = false;    /**     * getActionBar只能在onCreate进行get     *     * @param savedInstanceState     */    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        /*左上角icon显示        getActionBar().setDisplayShowHomeEnabled(false);        左上角返回键显示        ActionBar actionBar=getActionBar();        actionBar.setDisplayHomeAsUpEnabled(true);*/        isShowIcon();        isShowBack();        isShowBackIcon();        isShowTitle();        setTitleIcon();        setTitleBackground();    }    /**     * actionbar为顶部菜单布局     *     * @param menu     * @return     */    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_base, menu);        return true;    }    /**     * 每个顶部menu的监听,如果横向添加的话android会自定义下拉编写,不用进行方法的重写实现     *     * @param item     * @return     */    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        switch (item.getItemId()) {            case android.R.id.home:                BaseBack();                break;//            case R.id.base_action_setting1://                finish();//                break;        }        return super.onOptionsItemSelected(item);    }    /**     * 为返回监听提供重写的方法     */    protected void BaseBack() {        finish();    }    /**     * 为子activity的icon初始化提供重写方法     */    protected void isShowIcon() {        getActionBar().setDisplayShowHomeEnabled(true);    }    /**     * 为子activity的back按钮初始化提供重写方法     */    protected void isShowBack() {        getActionBar().setDisplayHomeAsUpEnabled(true);    }    /**     * 为子activity的title标题是否显示提供重写方法     */    protected void isShowTitle() {        getActionBar().setDisplayShowTitleEnabled(true);    }    /**     * 为子activity的返回图标是否显示提供重写方法     */    protected void isShowBackIcon() {        getActionBar().setDisplayHomeAsUpEnabled(false);    }    /**     * 为子activity的icon图标提供私人定制的重写方法     */    protected void setTitleIcon() {        getActionBar().setIcon(getResources().getDrawable(R.drawable.title_back));    }    /**     * 为子activity的title背景提供私人定制的重写方法     */    protected void setTitleBackground() {        getActionBar().setBackgroundDrawable(getResources().getDrawable(R.color.customthemebackground));    }    /**     * 一级标题     *     * @param title     */    protected void setTitleContent(String title) {        getActionBar().setTitle(title);    }    /**     * 二级标题     *     * @param subtitle     */    protected void setSubtitleContent(String subtitle) {        getActionBar().setSubtitle(subtitle);    }    protected void isActionBaiHide(boolean ishide) {        getActionBar().hide();    }    /**     * 对重新赋值的字段进行判断     */    @Override    protected void onResume() {        super.onResume();        if (title != null && !title.equals("")) {            setTitleContent(title);        }        if (subtitle != null && !subtitle.equals("")) {            setSubtitleContent(subtitle);        }        if (ishide) {            isActionBaiHide(true);        }    }}

以上都是博主的命名习惯,大家可以根据自己的习惯进行相应的命名,然后是普通的base

package cn.edu.sjzc.fanyafeng.testlamejni.activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.Window;import android.widget.ImageButton;import android.widget.TextView;import cn.edu.sjzc.fanyafeng.testlamejni.R;/** * 自定义actionbar的父类 */public class BaseCustomActivity extends Activity {    protected boolean isShowShare = false;    protected String title;    public TextView base_custom_titlebar_title;    public ImageButton base_custom_titlebar_back;    public ImageButton base_custom_titlebar_share;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);    }    @Override    protected void onResume() {        super.onResume();        base_custom_titlebar_back = (ImageButton) findViewById(R.id.base_custom_titlebar_back);        base_custom_titlebar_share = (ImageButton) findViewById(R.id.base_custom_titlebar_share);        base_custom_titlebar_title = (TextView) findViewById(R.id.base_custom_titlebar_title);        if (base_custom_titlebar_back != null) {            base_custom_titlebar_back.setVisibility(View.VISIBLE);            base_custom_titlebar_back.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View arg0) {                    onBackPressed();                }            });        }        if (base_custom_titlebar_share != null) {            if (isShowShare) {                base_custom_titlebar_share.setVisibility(View.VISIBLE);                base_custom_titlebar_share.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View arg0) {                        onShare();                    }                });            } else {                base_custom_titlebar_share.setVisibility(View.GONE);            }        }        if (title != null && !title.equals("")) {            setTitle(title);        }    }    /**     * 为子类的分享提供重写方法     */    protected void onShare() {    }    @Override    public void setTitle(CharSequence title) {        if (base_custom_titlebar_title != null)            base_custom_titlebar_title.setText(title);    }}

还有就是楼主定义了一个空的share方法, 到时候可以配置好环境加上的,子类重写就可以了,还有一个标题的title,直接在子类的oncreate里面赋值就行,如果不赋值有默认的,再来看main,它继承的是actionbar的那个base

package cn.edu.sjzc.fanyafeng.testlamejni.activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import cn.edu.sjzc.fanyafeng.testlamejni.R;public class MainActivity extends BaseActivity {    private TextView user_sex, user_age, user_csdn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        title = "樊亚风";        subtitle = qq;        initView();        initData();    }    private void initView() {        user_sex = (TextView) findViewById(R.id.user_sex);        user_age = (TextView) findViewById(R.id.user_age);        user_csdn = (TextView) findViewById(R.id.user_csdn);    }    private void initData() {        user_sex.setText(sex);        user_age.setText(age);        user_csdn.setText(csdn);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        switch (id) {            case android.R.id.home:                break;            case R.id.second_action_setting:                Intent intent = new Intent(MainActivity.this, SettingActivity.class);                startActivity(intent);                break;            case R.id.action_photo:                Intent intent1 = new Intent(MainActivity.this, PhotoActivity.class);                startActivity(intent1);                break;            case R.id.action_scan:                Intent intent2 = new Intent(MainActivity.this, ScanActivity.class);                startActivity(intent2);                break;            case R.id.second_action_theme:                Intent intent3 = new Intent(MainActivity.this, ChangeThemeActivity.class);                startActivity(intent3);                break;            case R.id.main_action_test1:                Intent intent4 = new Intent(MainActivity.this, TestBaseActivity.class);                startActivity(intent4);                break;            case R.id.main_action_test2:                Intent intent5 = new Intent(MainActivity.this, TestWeChatActivity.class);                startActivity(intent5);                break;            case R.id.main_action_test3:                Intent intent6 = new Intent(MainActivity.this, TestTitleActivity.class);                startActivity(intent6);                break;            case R.id.main_action_test4:                Intent intent7 = new Intent(MainActivity.this, TestHideActivity.class);                startActivity(intent7);                break;            case R.id.main_action_test5:                Intent intent8 = new Intent(MainActivity.this, TestCustomActivity.class);                startActivity(intent8);                break;            case R.id.main_action_test6:                Intent intent9 = new Intent(MainActivity.this, TestPopWindowActivity.class);                startActivity(intent9);                break;            case R.id.main_action_test7:                Intent intent10 = new Intent(MainActivity.this, ChangeBackgroudActivity.class);                startActivity(intent10);                break;        }        return super.onOptionsItemSelected(item);    }    @Override    protected void BaseBack() {    }    @Override    protected void isShowBack() {    }    @Override    protected void isShowIcon() {        getActionBar().setDisplayShowHomeEnabled(false);    }    @Override    protected void setTitleBackground() {    }    @Override    protected void onResume() {        super.onResume();    }}

menu

<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    tools:context=".MainActivity">    <item        android:id="@+id/main_action_test"        android:title="测试"        android:showAsAction="ifRoom|withText"        android:orderInCategory="50">        <menu>            <item                android:id="@+id/main_action_test1"                android:showAsAction="always|withText"                android:icon="@drawable/f"                android:title="base测试" />            <item                android:id="@+id/main_action_test2"                android:showAsAction="always|withText"                android:icon="@drawable/a"                android:title="微信背景测试" />            <item                android:id="@+id/main_action_test3"                android:showAsAction="always|withText"                android:icon="@drawable/n"                android:title="测试title标题" />            <item                android:id="@+id/main_action_test4"                android:showAsAction="always|withText"                android:icon="@drawable/y"                android:title="测试隐藏actionbar" />            <item                android:id="@+id/main_action_test5"                android:showAsAction="always|withText"                android:icon="@drawable/a"                android:title="测试自定义actionbar" />            <item                android:id="@+id/main_action_test6"                android:showAsAction="always|withText"                android:icon="@drawable/f"                android:title="测试popwindow" />            <item                android:id="@+id/main_action_test7"                android:showAsAction="always|withText"                android:icon="@drawable/e"                android:title="测试切换背景" />        </menu>    </item>    <item        android:id="@+id/action_settings"        android:title="设置"        android:showAsAction="ifRoom|withText"        android:orderInCategory="50">        <menu>            <item                android:id="@+id/second_action_theme"                android:showAsAction="always|withText"                android:icon="@drawable/y"                android:title="更换主题" />            <item                android:id="@+id/second_action_setting"                android:showAsAction="always|withText"                android:icon="@drawable/a"                android:title="系统设置" />        </menu>    </item>    <item        android:icon="@drawable/more"        android:showAsAction="ifRoom|withText"        android:orderInCategory="50">        <menu>            <item                android:id="@+id/action_photo"                android:title="拍照"                android:icon="@drawable/f"                android:orderInCategory="100"                android:showAsAction="never" />            <item                android:id="@+id/action_scan"                android:title="扫码"                android:icon="@drawable/e"                android:orderInCategory="100"                android:showAsAction="never" />            <item                android:id="@+id/action_record"                android:title="录音"                android:icon="@drawable/n"                android:orderInCategory="100"                android:showAsAction="never" />            <item                android:id="@+id/action_shoot"                android:title="录像"                android:icon="@drawable/g"                android:orderInCategory="100"                android:showAsAction="never" />        </menu>    </item></menu>

因为实际编写代码过程中定义实体是很常用的,更重要的是如果放在listview中,那么,楼主定义了一个basebean

package cn.edu.sjzc.fanyafeng.testlamejni.Bean;/** * Created by Administrator on 2015/5/29/0029. */public class ABaseBean implements Comparable {    @Override    public int compareTo(Object another) {        return 0;    }}

博主只是浅析,大家可以根据自己的理解或者结合自己的需要再进行自定义,下面放几张效果图








继承base这一方面需要大家去钻研,简单用了一下popwindow



0 0
原创粉丝点击