Android之样式和基类的抽取
2016-08-08 00:20
155 查看
样式和基类的抽取
1、样式的抽取
在布局文件中有大量相似的属性定义,为了代码的简洁和提高复用性,我们可以提取出相同的定义放在一个地方,让所有用到它的控件来调用它。这就有了样式和基类的出现:我们先来说一下样式的抽取:
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="@android:color/holo_blue_bright" android:gravity="center" android:textSize="25sp" android:text="欢迎使用手机防盗"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="@android:color/holo_blue_bright" android:gravity="center" android:textSize="25sp" android:text="欢迎使用手机杀毒/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="@android:color/holo_blue_bright" android:gravity="center" android:textSize="25sp" android:text="欢迎使用手机流量控制/>
上面三个textview的定义都是在三个不同的布局文件中使用的,他们有共同的属性,那就可以把他们抽取出来放在values文件夹下的style.xml文件中:
定义如下:
<style name="text_setup_title"> <item name="android:textSize">25sp</item> <item name="android:gravity">center</item> <item name="android:background">@android:color/holo_blue_bright</item> <item name="android:padding">5dp</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> </style>
这样大大简化了代码的书写,以后不管哪里需要用到类似的布局设置只要引用即可
<TextView style="@style/text_setup_title" android:text="欢迎使用手机防盗"/> <TextView style="@style/text_setup_title" android:text="欢迎使用手机杀毒"/> <TextView style="@style/text_setup_title" android:text="欢迎使用手机流量控制"/>
这样是不是方便了很多呢。
2、基类的抽取:
基类的抽取和样式的原理差不多,都是简化了代码的书写,基类的抽取是把相同的代码抽取出来放在一个基类中,以后谁想用这些方法就可以直接继承这个基类实现里面的方法。下面来看一个例子:基类的实现:
public abstract class SetupBaseActivity extends Activity { SharedPreferences sp; //先声明一个手势识别器 private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sp=getSharedPreferences("config", MODE_PRIVATE); //2、初始化手势识别器 mGestureDetector=new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { /** * e1、手指触摸屏幕的一瞬间 * e2、手指离开屏幕的一瞬间 * velocityX、velocityY:水平方向和竖直方向的速度,单位px/s * */ if(Math.abs(e1.getRawY()-e2.getRawY())>100){ ToastUtils.show(SetupBaseActivity.this, "动作不合法"); return true; } if((e1.getRawX()-e2.getRawX())>150){ showNext(); overridePendingTransition(R.anim.trans_next_in, R.anim.trans_next_out); return true; } if((e2.getRawX()-e1.getRawX())>150){ showPre(); overridePendingTransition(R.anim.trans_pre_in, R.anim.trans_pre_out); return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); } //第三步、是手势识别器识别用户的动作 @Override public boolean onTouchEvent(MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; } //子类要实现的方法 public abstract void showNext(); public abstract void showPre(); /** * 下一步 * @param view */ public void next(View view){ showNext(); overridePendingTransition(R.anim.trans_next_in, R.anim.trans_next_out); } /** * 上一步 * @param view */ public void pre(View view){ showPre(); overridePendingTransition(R.anim.trans_pre_in, R.anim.trans_pre_out); } }
子类的实现:
1、子类一 public class Setup1Activity extends SetupBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup1); } @Override public void showNext() { IntentUtils.startActivityAndFinish(Setup1Activity.this, Setup2Activity.class); } @Override public void showPre() { } } 2、子类二 public class Setup2Activity extends SetupBaseActivity { private SettingCheckView setcheck; private TelephonyManager tm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup2); //电话管理,系统的服务,可以获得sim卡的唯一序列号 tm=(TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); setcheck = (SettingCheckView) findViewById(R.id.set_bind_text); final String sim=sp.getString("sim", null); if(TextUtils.isEmpty(sim)){ ToastUtils.show(this, "手机还没有绑定手机号"); }else{ setcheck.setChecked(true); } setcheck.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Editor edit=sp.edit(); if(TextUtils.isEmpty(sim)){ setcheck.setChecked(true); String sim1=tm.getSimSerialNumber(); edit.putString("sim", sim1); }else{ setcheck.setChecked(false); edit.putString("sim", null); } edit.commit(); } }); } @Override public void showNext() { String sim=sp.getString("sim",null); if(TextUtils.isEmpty(sim)){ //判断sim卡序列号是否为空 ToastUtils.show(this,"开启手机防盗,必须绑定手机序列号"); }else{ IntentUtils.startActivityAndFinish(Setup2Activity.this, Setup3Activity.class); } } @Override public void showPre() { IntentUtils.startActivityAndFinish(Setup2Activity.this, Setup1Activity.class); } } 3、子类三 public class Setup3Activity extends SetupBaseActivity { private Button contacts_select; private EditText ed_select_number; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup3); ed_select_number=(EditText) findViewById(R.id.ed_select_number); ed_select_number.setText(sp.getString("phone", "")); //获取联系人列表 contacts_select=(Button) findViewById(R.id.btn_select_contacts); contacts_select.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //选择联系人 //开启一个界面并返回值 Intent intent=new Intent(Setup3Activity.this,ContactsActivity.class); startActivityForResult(intent, 0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(data!=null){ if(resultCode==0){ //获取返回的电话号码并显示到控件上 String savedphone=data.getStringExtra("phone"); ed_select_number.setText(savedphone); } } super.onActivityResult(requestCode, resultCode, data); } @Override public void showNext() { if(TextUtils.isEmpty(ed_select_number.getText())){ ToastUtils.show(Setup3Activity.this, "安全号码不能为空"); }else{ String phone=ed_select_number.getText().toString().replace("-", "").trim(); Editor edit=sp.edit(); edit.putString("phone", phone); edit.commit(); IntentUtils.startActivityAndFinish(Setup3Activity.this, Setup4Activity.class); } } @Override public void showPre() { IntentUtils.startActivityAndFinish(Setup3Activity.this, Setup2Activity.class); } }
里面用到了一些自定义开启意图的方法:
自定义了Activity的开启的方式,开启意图的工具类
/** * 开启意图的方式 * @author Administrator * */ public class IntentUtils { /** * 进入一个界面 */ public static void startActivityInfo(Activity context,Class<?>cls){ Intent intent=new Intent(context,cls); context.startActivity(intent); } /** * 进入一个界面并结束自己 */ public static void startActivityAndFinish(Activity context,Class<?>cls){ Intent intent=new Intent(context,cls); context.startActivity(intent); context.finish(); } /** * 延迟进入进入一个界面 * */ public static void startActivityDelay(final Activity context,final Class<?>cls,final long time){ new Thread(){ @Override public void run() { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } Intent intent=new Intent(context,cls); context.startActivity(intent); } }.start(); } /** * 延迟进入进入另一个界面并销毁这个界面 * */ public static void startActivityDelayAndFinish(final Activity context,final Class<?>cls,final long time){ new Thread(){ @Override public void run() { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } Intent intent=new Intent(context,cls); context.startActivity(intent); context.finish(); } }.start(); } }
相关文章推荐
- android BaseAdapter 自定义适配器 BaseAdapter基类抽取 一
- android 抽取主题样式
- (转)Android中的基类—抽取出来公共的方法
- android 学习笔记14- 项目实战 基类抽取 标题定义 界面滑动
- Android xml中控件共同样式的抽取
- android 控件样式抽取
- android BaseAdapter 自定义适配器 BaseAdapter基类抽取 二
- Android代码规范化:抽取Activity基类
- Android简单抽取基类问题
- Android中的基类—抽取出来公共的方法
- Android样式的抽取使用与国际化(中英双语)
- Android简单抽取基类
- android string.xml中的string样式总结
- 为android的view组件指定样式
- 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!
- android style 样式继承 说明
- Android中有用的Item选中和按下去的样式
- Android: 自定义Tab样式
- Android下用程序的方法为ListView设置分割线Divider样式
- 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!