最近,公司有这个一个改动,需要将写好的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:戳进下载地址