上周学校答辩毕业等事比较多,博客停了一周,今天又是周一上班处理的事情比较多,不过还得把上周没总结的总结了,废话不多说,先上代码:
因为现在接触的代码比较多了,所以现在对代码的重用性,耦合性等等比较重视,感觉很重要
还是先看一下目录结构吧,不然下面的代码会看不懂的
博主先定义了一个最最底层的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