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
- Android最新控件ActionBar入门浅析
- Android ActionBar控件使用
- Android ActionBar入门
- Android控件ActionBar浅析及适配2.x的方法介绍
- (Android 基础知识) ActionBar----顶部控件
- Android原生控件---ActionBar详解
- android Menu与ActionBar和TitleBar浅析
- Android入门--ActionBar的使用
- Android 最新控件 Toolbar
- Android最新控件FlexboxLayout
- android控件TabHost浅析
- 【android自定义控件】LinearLayout定义ActionBar样式
- Android应用程序——ActionBar控件
- android 控件 下拉刷新 ActionBar-PullToRefresh
- Android--Dagger入门浅析
- Android入门之ActionBar实现Tab导航
- 最新历史版本 :浅析Android线程模型
- ActionBar入门
- eclipse下Tomcat7.0启动奔溃问题
- Note on <Pro ASP.NET MVC 4> - 01
- 【算法】寻找和为定值的多个数
- 病中吟之内存溢出
- 怎样测试串口和串口线是否正常
- Android最新控件ActionBar入门浅析
- 搜索引擎反作弊的三个模型
- WebService 实例构建
- Spring jar包的作用
- ListView初步解析
- Delphi 常用API 函数
- 服务号微信订阅号是否要合并了?服务号要被集中到订阅列表中
- 缓存机制Cache ARC算法(一)
- 交换两个整数不通过中间变量