ActivityGroup框架

ActivityGroup框架_第1张图片 

一、Demo结构简介
进入正题:先上两张项目结构图
ActivityGroup框架_第2张图片 ActivityGroup框架_第3张图片
1、AbsActivityGroup是本Demo的核心框架,封装了很多功能。
2、AbsSubActivity是子Activity的核心框架,重写了一些方法,这样可以支持一个子Activity既可以在同一个ActivityGroup里面向其他子Activity跳转,也支持向Group外部的普通Activity跳转,而跳转方法的不同取决于目标的Activity是否继承了AbsSubActivity。
3、MainActivityGroup是主ActivityGroup,继承自AbsActivityGroup。
4、OutActivity是一个普通的Activity,不是MainActivityGroup的内部子Activity。
5、其他的都是子Activity,继承自AbsSubActivity,其中A、B、C、D、E开头的表明该子Activity分别对应MainActivityGroup的A、B、C、D、E五个标签选项卡,每个选项卡都可以对应多个子Activity。
6、SimpleActivty是特殊的子Activity,它可以存在于任何标签下,其实前面的也可以,但因为名字约束了就将其固定在一个标签下了,实际开发中选项卡共用同一个子Activity的情况也不是很多。

二、框架特色
1、功能强大:每个选项卡都可以对应多个子Activity,这个是普通TabActivity做不到的。
2、非常方便,实现的ActivityGroup只要继承AbsActivityGroup并实现它的5个回调方法即可;
     同理,实现的子Activity只要继承AbsSubActivity即可,不需要重写任何方法。
3、支持各种跳转:选项卡之间的相互切换;
     同一标签卡下的子Activity内部跳转,带结果返回的内部跳转;
     向ActivityGroup外部的普通Activity的跳转以及带结果返回的跳转;
     支持选项卡再按一次返回该选项卡的第一个界面的功能。
4、支持记忆性:所有内部返回操作不会重新onCreate新的子Activity,所有向前跳转都是onCreate新的Activity。


三、使用方法及注意事项(以下内容暂不涉及框架原理)

1、主ActivityGroup的layout代码(示例):
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        
  3.     style="@style/layout_full"
  4.     android:orientation="vertical"
  5.     android:background="#ffffff">         
  6.     <LinearLayout
  7.             android:id="@+id/activity_group_container"
  8.                 style="@style/layout_vertical"
  9.             android:layout_weight="8.5">         
  10.     </LinearLayout>
  11.     <RadioGroup
  12.             style="@style/bottombar_radioGroup"
  13.             android:id="@+id/activity_group_radioGroup"
  14.             android:checkedButton="@+id/activity_group_radioButton0"
  15.             android:background="#ff0000"
  16.             android:layout_weight="1">
  17.             <RadioButton
  18.                style="@style/bottombar_radioButton"
  19.                android:id="@id/activity_group_radioButton0"/> 
  20.             <RadioButton
  21.                style="@style/bottombar_radioButton"
  22.                android:id="@+id/activity_group_radioButton1"/>
  23.             <RadioButton
  24.                style="@style/bottombar_radioButton"
  25.                android:id="@+id/activity_group_radioButton2"/>
  26.             <RadioButton
  27.                style="@style/bottombar_radioButton"
  28.                android:id="@+id/activity_group_radioButton3"/>
  29.            <RadioButton
  30.                style="@style/bottombar_radioButton"
  31.                       android:id="@+id/activity_group_radioButton4"/>
  32.     </RadioGroup>
  33. </LinearLayout>
复制代码


说明:一些细节已被我用style封装起来了, 写这个布局要注意放子Activity的布局和radioGroup的id要写成和我这里的一样,
也就是上面的 android:id="@+id/activity_group_container" android:id="@+id/activity_group_radioGroup" 代码中的8.5和1的两个weight数值,是这两部分的显示比例,大家可以根据自己项目的需求进行调整。


2、MainActivityGroup的实现(代码注释比较详细,我就不废话了)
  1. // 继承AbsActivityGroup并实现其五个抽象方法即可
  2. public class MainActivityGroup extends AbsActivityGroup{

  3.         // 第一个需要实现的方法,直接返回ActivityGroup实现类的layou布局即可
  4.         // 注意该布局一定要有个id为activity_group_container的布局用来放子Activity的布局
  5.         @Override
  6.         protected int getLayoutResourceId() {
  7.                 return R.layout.activity_group_bottom5_layout;
  8.         }

  9.         // 第二个需要实现的方法,返回layout布局下选项卡对应的radioButton的id
  10.         @Override
  11.         protected int[] getRadioButtonIds() {
  12.                 return new int[] { R.id.activity_group_radioButton0,
  13.                                 R.id.activity_group_radioButton1,
  14.                                 R.id.activity_group_radioButton2,
  15.                                 R.id.activity_group_radioButton3,
  16.                                 R.id.activity_group_radioButton4 };
  17.         }

  18.         // 第三个需要实现的方法,上面一个方法中的radioButton对应的图标,注意图标的尺寸要自己调整到合适大小
  19.         @Override
  20.         protected int[] getRadioButtonImageIds() {
  21.                 return new int[] { R.drawable.icon2, R.drawable.icon2, R.drawable.icon2,
  22.                                 R.drawable.icon2, R.drawable.icon2, };
  23.         }

  24.         // 第四个需要实现的方法,radioButton对应的文字,也就是选项卡标签的文字,
  25.         // 最好不要太长,否则要到布局文件里调整文字大小到适应界面
  26.         @Override
  27.         protected String[] getRadioButtonTexts() {
  28.                 return new String[]{"A","B","C","D","E"};
  29.         }

  30.         // 第五个需要实现的方法,返回每个选项卡对应的第一个子Activity(注意要继承自AbsSubActivity)
  31.         @SuppressWarnings("unchecked")
  32.         @Override
  33.         public Class<? extends Activity>[] getClasses() {
  34.                 Class<? extends Activity>[] classes = new Class[] { A1Activity.class,
  35.                                 B1Activity.class, C1Activity.class, D1Activity.class,
  36.                                 E1Activity.class };
  37.                 return classes;
  38.         }

  39. }
复制代码
3、子Activity的实现(以A1Activity为例)
  1. public class A1Activity extends AbsSubActivity{
  2.         
  3.         private TextView tv;
  4.         private EditText et;
  5.         private Button btn1,btn2,btn3,btn4,btn5;
  6.         
  7.     public void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.main); 
  10.         
  11.         tv = ((TextView)findViewById(R.id.test));
  12.         et = (EditText) findViewById(R.id.et);
  13.         btn1 = ((Button)findViewById(R.id.btn));
  14.         btn2 = ((Button)findViewById(R.id.btn2));
  15.         btn3 = ((Button)findViewById(R.id.btn3));
  16.         btn4 = ((Button)findViewById(R.id.btn4));
  17.         btn5 = ((Button)findViewById(R.id.btn5));

  18.         tv.setText("A1Activity");
  19.         btn1.setText("跳到A2Activity(startActivity方式)");
  20.         btn2.setText("跳到A2Activity(ForResult方式)");
  21.         btn3.setText("跳出Group到OutActivity(startActivity方式)");
  22.         btn4.setText("跳出Group到OutActivity(ForResult方式)");
  23.         btn1.setOnClickListener(myClickListener);
  24.         btn2.setOnClickListener(myClickListener);
  25.         btn3.setOnClickListener(myClickListener);
  26.         btn4.setOnClickListener(myClickListener);
  27.         btn5.setOnClickListener(myClickListener);

  28.     }
  29.     private OnClickListener myClickListener = new  OnClickListener(){

  30.                 @Override
  31.                 public void onClick(View v) {
  32.                         if(v == findViewById(R.id.btn)){
  33.                                 startActivity(new Intent(A1Activity.this,A2Activity.class));
  34.                         } else if(v == findViewById(R.id.btn2)){
  35.                                 startActivityForResult(new Intent(A1Activity.this,A2Activity.class),1);
  36.                         } else if(v == findViewById(R.id.btn3)){
  37.                                 startActivity(new Intent(A1Activity.this,OutActivity.class));
  38.                         } else if(v == findViewById(R.id.btn4)){
  39.                                 startActivityForResult(new Intent(A1Activity.this,OutActivity.class),2);
  40.                         } else if(v == findViewById(R.id.btn5)){
  41.                                 finish();
  42.                         }
  43.                 }
  44.             
  45.     };

  46.         @Override
  47.         protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  48.                 if(requestCode == 1 && resultCode == 1){
  49.                         et.setText("从A2Activity回来了   ");
  50.                 } else if(requestCode == 2 && resultCode == 2){
  51.                         et.setText("从OutActivity回来了   "+data.getStringExtra("data"));
  52.                 }
  53.                 
  54.         }
  55.        
  56. }
复制代码
大家都能看得懂的代码,除了继承自AbsSubActivity外,其余和普通Activity的代码一样,
但因为框架重写了跳转方法,所以以上代码中按钮的监听事件里的子Activity间的跳转就顺利实现了。
不过设置返回结果稍显不一样,普通Activity(OutActivity)是这样的:          
Intent intent = getIntent();             
  intent.putExtra("data",et.getText().toString().trim());           
setResult(2,intent);          
finish();
而子Activity不能调用finish();所以我在框架里封装了另一个方法供调用:              
fromIntent.putExtra("data",et.getText().toString().trim());         
gobackWithResult(1,fromIntent);  
而如果不需要设置返回结果,可以调用另一个封装好的方法goback();
四、框架源码:

由于本教程的核心不是讲框架的原理,加之这个框架说大不大,说小不小,所以只加了一部分必要的注释,大家自己看看吧,相信大家是能够看得懂的  
不好意思各位,由于篇幅的原因影响到帖子排版,源码就不贴了,大家下载附件下来自己看吧

你可能感兴趣的:(ActivityGroup框架)