您的位置:首页 > 移动开发 > Android开发

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