让activity的逻辑业务快速切换到fragment

来源:互联网 发布:维尔迪数据 编辑:程序博客网 时间:2024/05/15 09:03

最近,公司有这个一个改动,需要将写好的5个activity封装成5个fragment并放在同一个activity上,如果在平时或许很简单,但是,这5个activity每一个都有不少于1000行的代码量,处理起来相当麻烦,因此,为避免重蹈覆辙,想到了一种比较好的解决方案。


activity写10个控件。

一般情况是这样做的:

package com.test.acttofrag;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Button btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initListener();    }    private void initView(){        btn1 = (Button) findViewById(R.id.btn1);        btn2 = (Button) findViewById(R.id.btn2);        btn3 = (Button) findViewById(R.id.btn3);        btn4 = (Button) findViewById(R.id.btn4);        btn5 = (Button) findViewById(R.id.btn5);        btn6 = (Button) findViewById(R.id.btn6);        btn7 = (Button) findViewById(R.id.btn7);        btn8 = (Button) findViewById(R.id.btn8);        btn9 = (Button) findViewById(R.id.btn9);        btn10 = (Button) findViewById(R.id.btn10);    }    private void initListener(){        btn1.setOnClickListener(this);        btn2.setOnClickListener(this);        btn3.setOnClickListener(this);        btn4.setOnClickListener(this);        btn5.setOnClickListener(this);        btn6.setOnClickListener(this);        btn7.setOnClickListener(this);        btn8.setOnClickListener(this);        btn9.setOnClickListener(this);        btn10.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.btn1:                Toast.makeText(this, "点击第一个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn2:                Toast.makeText(this, "点击第二个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn3:                Toast.makeText(this, "点击第三个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn4:                Toast.makeText(this, "点击第四个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn5:                Toast.makeText(this, "点击第五个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn6:                Toast.makeText(this, "点击第六个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn7:                Toast.makeText(this, "点击第七个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn8:                Toast.makeText(this, "点击第八个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn9:                Toast.makeText(this, "点击第九个", Toast.LENGTH_SHORT).show();            case R.id.btn10:                Toast.makeText(this, "点击第十个", Toast.LENGTH_SHORT).show();                break;            default:                break;        }    }}
逻辑层都写在activity上,效果图如下:



此时R.layout.activity_main代码如下:

<?xml version="1.0" encoding="utf-8"?><ScrollView    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <Button            android:id="@+id/btn1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮1"/>        <Button            android:id="@+id/btn2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮2"/>        <Button            android:id="@+id/btn3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮3"/>        <Button            android:id="@+id/btn4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮4"/>        <Button            android:id="@+id/btn5"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮5"/>        <Button            android:id="@+id/btn6"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮6"/>        <Button            android:id="@+id/btn7"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮7"/>        <Button            android:id="@+id/btn8"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮8"/>        <Button            android:id="@+id/btn9"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮9"/>        <Button            android:id="@+id/btn10"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="按钮10"/>    </LinearLayout></ScrollView>

此时,要将activity的业务逻辑放到fragment上,必定要进行一下改动,首先,copy一份R.layout.activity_main并且保存为R.layout.fragment。

并将R.layout.activity_main改为如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <FrameLayout        android:id="@+id/fl"        android:layout_width="match_parent"        android:layout_height="match_parent">    </FrameLayout></LinearLayout>
此刻的MainActivity代码如下:

package com.test.acttofrag;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class MainActivity extends AppCompatActivity{    private MyFragment fragment = new MyFragment();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        getSupportFragmentManager().beginTransaction().add(R.id.fl,fragment).commit();    }}
此刻,activity的业务逻辑都交给了fragment,但是,单独复制一点点东西都感觉有点麻烦了,那么当要复制一大段东西时,那是相当麻烦!!!!


因此,做出了处理,将单独的业务逻辑抽出来,放在自定义ViewGroup中处理,

我们先将layout.fragment复制到R.layout.operation(业务)上。

此刻的MainActivity代码如下,看起来更简洁,如需将业务撤换到fragment上也更加的方便。

package com.test.acttofrag;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class MainActivity extends AppCompatActivity{    private MyViewGroup vp ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        vp = new MyViewGroup(this);        setContentView(vp);    }}
现在看看MyViewGroup是何方神圣,其实也很简单,就是将业务逻辑的处理写在了这个类上。


package com.test.acttofrag;import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.widget.Button;import android.widget.FrameLayout;import android.widget.Toast;/** * Created by 13798 on 2016/7/29. */public class MyViewGroup extends FrameLayout implements View.OnClickListener {    private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10;    public MyViewGroup(Context context) {        this(context, null);    }    public MyViewGroup(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        View.inflate(context, R.layout.operation, this);        initView();        initListener();    }    private void initView() {        btn1 = (Button) findViewById(R.id.btn1);        btn2 = (Button) findViewById(R.id.btn2);        btn3 = (Button) findViewById(R.id.btn3);        btn4 = (Button) findViewById(R.id.btn4);        btn5 = (Button) findViewById(R.id.btn5);        btn6 = (Button) findViewById(R.id.btn6);        btn7 = (Button) findViewById(R.id.btn7);        btn8 = (Button) findViewById(R.id.btn8);        btn9 = (Button) findViewById(R.id.btn9);        btn10 = (Button) findViewById(R.id.btn10);    }    private void initListener() {        btn1.setOnClickListener(this);        btn2.setOnClickListener(this);        btn3.setOnClickListener(this);        btn4.setOnClickListener(this);        btn5.setOnClickListener(this);        btn6.setOnClickListener(this);        btn7.setOnClickListener(this);        btn8.setOnClickListener(this);        btn9.setOnClickListener(this);        btn10.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.btn1:                Toast.makeText(getContext(), "点击第一个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn2:                Toast.makeText(getContext(), "点击第二个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn3:                Toast.makeText(getContext(), "点击第三个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn4:                Toast.makeText(getContext(), "点击第四个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn5:                Toast.makeText(getContext(), "点击第五个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn6:                Toast.makeText(getContext(), "点击第六个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn7:                Toast.makeText(getContext(), "点击第七个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn8:                Toast.makeText(getContext(), "点击第八个", Toast.LENGTH_SHORT).show();                break;            case R.id.btn9:                Toast.makeText(getContext(), "点击第九个", Toast.LENGTH_SHORT).show();            case R.id.btn10:                Toast.makeText(getContext(), "点击第十个", Toast.LENGTH_SHORT).show();                break;            default:                break;        }    }}

此时,再将业务掉到在fragment上显示,也很简单,MainActivity还是老样子:

private MyFragment fragment = new MyFragment();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        getSupportFragmentManager().beginTransaction().add(R.id.fl,fragment).commit();    }
然而,fragment也只要返回一下MyViewGroup对象,就可以了,如下:
public class MyFragment extends Fragment{    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        MyViewGroup vp = new MyViewGroup(getActivity());        return vp;    }}


这样,当变态的需求想将N个activity改成N个fragment封装在一个activity内的时候,也无懈可击了。



demo:戳进下载地址

1 0
原创粉丝点击