让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
- 让activity的逻辑业务快速切换到fragment
- app全fragment混少量Activity的切换逻辑
- app全fragment混少量Activity的切换逻辑
- Android的activity里fragment切换到下一个fragment页面
- 同一Activity的Fragment切换
- Android的fragment页面点击按钮切换到下一个fragment页面,由主activity控制
- Android让Fragment加载到Activity中
- Android让Fragment加载到Activity中
- Android让Fragment加载到Activity中
- Activity的fragment间的切换
- 切换默认Activity和Fragment的动画
- Activity和fragment的简单切换效果
- 外部Activity和fragment之间的切换
- 一个Activity中多个Fragment的切换
- Activity中多个fragment切换
- activity、fragment切换动画
- Activity跳转Activity,Fragment切换下一个Fragment
- Android如何让Fragment加载到Activity中
- Java 加载配置文件的方式 一
- 线程与进程02
- 华为OJ 初级:查找输入整数二进制中1的个数
- Hive入门--6.表的基本操作
- hdu 1525 Euclid's Game (博弈规律)
- 让activity的逻辑业务快速切换到fragment
- c语言学习(三)
- 有关继承,实现接口,子类,实例化对象之间总结
- 实验 FileUpload 笔记
- java反射获得父类泛型参数
- 利用ThreadLocal & Filter 实现事务处理
- 使用 <base> 标签解决 相对路径问题
- Hibernate 多对多 HQL 查询
- Android Activity 全局管理 终极解决方案