样式和基类的抽取
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(); }
}
网友评论