Android最新控件ActionBar入门浅析

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

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

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


博主先定义了一个最最底层的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=fanyafeng
sex=man
age=24
qq=948744852
csdn=http://blog.csdn.net/qq_23195583
iswork=true
emil=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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值