美文网首页
10.第一行代码的最佳实践

10.第一行代码的最佳实践

作者: Jsonzhang | 来源:发表于2017-02-16 16:14 被阅读41次

    一、活动的最佳实践

    1. 知晓当前是在哪一个活动
    背景:当你进入一家新公司,阅读别人的代码是很头疼的事。现在偏偏需要你在某个界面修改一些非常简单的东西,但是你花了很长时间却找不到这个界面对应的是哪个活动。

    首先,我们新建一个BaseActivity继承Activity,然后重写onCreate()方法,代码如下:

    public class BaseActivity extend Activity{
        
        @override
        protected void onCreate(Bundle saveInstanceState){
            super.onCreate(saveInstanceState);
            Log.d("BaseActivity",getClass.getSimpleName());  //logcat输出当前Activity的类名
        }
    }
    

    然后项目中的其他Activity都继承BaseAcitivity,这样每当打开当前的活动,他的名字都会log日志中显示。

    2. 随时随地退出程序
    背景:比如我们从活动A到B到C,此时我们想一步退出程序,如果按home键只是在挂起在后台,并没有真正的退出。
    思路其实很简单,我们只需要一个专门的集合类对所有的活动进行管理就可以了。

    
    public class AcitivityCollector{
    
        public static List<Activity> activities = new ArrayList<Activity>();
        
        //添加Activity
        public static void addActivity(Activity activity){
            activities.add(activity);
        }
        
        //移除Activity
        public static void removeAcitivity(Activity activity){
            activities.remove(activity);
        }
        
        //关闭所有的Activity
        public static void finishAll(){
            for(Activity activity:activities){
                if(!activity.isFinishing()){
                    activity.finish();
                }
            }
        }
    
        //关闭所有Acitivit,只保留某个Acitivity
        public static void finishAllKeepOne(Class<?> clazz){
            for(Activity activity:activities){
                if (!clazz.getSimpleName().equals(activity.getClass().getSimpleName())){
                    if(!activity.isFinishing()){
                        activity.finish();
                    }
                }
            }
        }
    }
    

    然后我们在BaseAcitivity中稍作改动,每个Activity创建时都加入都集合中,销毁后从集合移除:

    public class BaseActivity extend Activity{
        
        @override
        protected void onCreate(Bundle saveInstanceState){
            super.onCreate(saveInstanceState);
            Log.d("BaseActivity",getClass.getSimpleName());  //logcat输出当前Activity的类名\
            
            ActivityCollector.addActivity(this);
        }
        
        @override
        protected void onDestroy(){
            super.onDestroy();
            ActivityCollector.removeActivity(this);
        }
    }
    

    从此以后,不管你想在什么地方退出程序,只需要调用AcitivityCollector.finish()方法就可以了。
    例如想在ThirdActivity中直接退出程序:

    public class ThirdActivity extend BaseActivity{
        
        @override
        protected void onCreate(Bundle saveInstanceState){
            super.onCreate(saveInstanceState);
            setContentView(R.layout.third_layout);
            Log.d("BaseActivity",getClass.getSimpleName());  //logcat输出当前Activity的类名\
            
            Button button = (Button)findViewById(R.id.button);
            button.setOnClickListener(new onClickListener(){
                    @override
                    public void onClick(View v){
                        ActivityCollector.finishAll();
                    }
                }
            );
        }
    }
    

    3. 启动活动的最佳写法
    背景:在退队写作项目中,你负责FirstActivity,而你的同事负责SecondActivity,这是你需要从FirstActivity跳转到SecondActivity,而SecondActivity还需要两个非常重要的字符串参数。这时无非有两种办法,一是你去找你的同事问需要哪两个参数;二是你自己阅读SecondActivity中的代码。

    其实我们可以这样来做,避免上面的窘境,请看:

    public class SecondActivity extend BaseActivity{
        
        //开启这个Activity的公共方法
        public static void actionStart(Context context,String data1,String data2){
            Intent intent = new Intent(context,SecondActivity.class);
            intent.putExtra("param1",data1);
            intent.putExtra("param2",data2);
            context.startActivity(intent);
        }
        ......
    }
    

    这样写的目的是代码一目了然,SecondActivity中所需的参数在方法中都体现出来了,这样你在FirstActivity中启动SecondActivity就非常简单了。

    button.setOnClickListener(new onClickListener(){
                    @override
                    public void onClick(View v){
                        SecondActivity.actionStart(FirstActivity.this,"data1","data2");
                    }
                }
            );
    

    二、自定义控件简例

    问题背景:我们在项目中都会用到很多公用的控件,比如每个页面都有标题,如下图所示,粗略图:

    Paste_Image.png

    我们可以将布局文件写完,然后再include到每个Activity的xml中,这样确实节省了一些代码,不用每个页面都再写一遍这个布局,但是返回和编辑两个按钮都是需要点击处理的,逻辑代码基本都一样。我们还是要每个页面都处理这两个按钮的点击事件,代码的复用性又变的很差。

    解决类似的问题就用到我们自定控件,把按钮的点击事件都写在自定义控件内,如下:

    public class TitleLayout extends LinearLayout{
    
        public TitleLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(context);
        }
    
        public TitleLayout(Context context, AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public TitleLayout(Context context) {
            this(context,null);
        }
        
        private void init(Context context){
            //引入布局界面
            LayoutInflater.from(context).inflate(R.layout.title, this);
            
             Button titleBack = (Button)findViewById(R.id.back);
             Button titleEdit = (Button)findViewById(R.id.edit);
             
             titleBack.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    ((Activity) getContext()).finish();
                }
            });
        }
    
    }
    

    这样只需要xml中将自定义控件嵌入,点击按钮的代码就都不需要写了。

    三、探究碎片Fragment

    相关文章

      网友评论

          本文标题:10.第一行代码的最佳实践

          本文链接:https://www.haomeiwen.com/subject/ieqhwttx.html