Android之样式和基类的抽取

样式和基类的抽取

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();
        }
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值