Android Activity和Fragment之间的跳转方式

预备知识

Fragment必须嵌入到Activity中, 当Activity暂停时, 其中的所有片段也会暂停, 当Activity被销毁时,所有片段也会被销毁. 不过,  当Activity正在运行时,可以独立操纵每个Fragment, 如添加或移除它们. 当执行此类Fragment事务时, 也可以将其添加到由Acitivy管理的返回栈中.

通过扩展Fragment类或其子类来创建一个片段, 没有用户界面的片段, 充当该片段所嵌入到Activity的一个worker, 当作Activity的不可见工作线程.

要在一个Activity中使用片段, 可以选择在布局文件中使用Fragment元素来声明. 在android:name属性中指定要在布局中实例化的Fragment类, 并且用android:id属性指定一个标识符, 每个片段都需要一个唯一的标识符, 可以通过三种方式为Fragment提供id:

(1) 为android:id属性提供唯一id

(2)为android:tag属性提供唯一字符串

(3)如果未给以上两个属性提供值, 系统会使用容器视图的id

<fragment
        android:id="@+id/fragment_select"
        android:name="com.example.zy.myapplication.SelectFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

当系统创建Activity布局时, 会实例化在布局中指定的每个片段, 并为每个片段调用onCreateView()方法以检索每个片段的布局. 系统会直接插入片段返回的View来替代<Fragment>元素 .

此外, 也可以通过代码在Activity运行期间随时将Fragment添加到Activity布局中,  在Activity中通过使用FragmentManager来管理片段, 通过调用getFragmentManager()或者getSupportFragmentManager()来获取FragmentManager的实例, 然后在FragmentManager调用beginTransaction()方法来获取FragmentTransaction对象, 从而得以执行Fragment事务.

准备工作

1. 布局

在MainActivity的布局文件中写一个子布局

  <FrameLayout    
        android:id="@+id/fragment_container"    
        android:layout_width="match_parent"    
        android:layout_height="0dp"   
        android:layout_weight="1"/>

2. 创建两个java类文件继承v4包的Fragment, 并重写onCreateView方法引用对应的Fragment布局文件 (下面以其中一个为例)

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (contentView == null) {  
        contentView = inflater.inflate(R.layout.my_fragment, container, false);   
        Button myButton = (Button) contentView.findViewById(R.id.my_button);        
        Button myReturn = (Button) contentView.findViewById(R.id.my_return);     
        Button myOther = (Button) contentView.findViewById(R.id.my_other);    
        myButton.setOnClickListener(this);  
        myReturn.setOnClickListener(this);     
        myOther.setOnClickListener(this); 
 }  
    return contentView;
}

3. 在MainActivity中先添加进一个Fragment进行最开始的展示(压栈式添加)

getSupportFragmentManager()
.beginTransaction()
      .replace(R.id.fragment_container,new MyFragment())
      .addToBackStack(null)
      .commit();

4. 在Fragment类中对几个按钮进行点击监听, 在点击方法对几个跳转进行操作(代码省略)

 

从同一个Activity的Fragment跳转到另一个Fragment

getActivity().getSupportFragmentManager() 
    .beginTransaction()
    .replace(R.id.xx, new XxxFragment(), null) 
    .addToBackStack(null)
    .commit();

说明:

R.id.xx: Fragment对应的Activity布局中FragmentLayout的id

new XxxFragment(): 要跳转到的Fragment

addToBackStack(null): 可以省略不写(不写表示为非压栈式添加)

从一个Activity的Fragment跳转到另外一个Activity

Intent intent = new Intent(getActivity(),OtherActivity.class); 
startActivity(intent);

从一个Activity跳转到另外一个Activity的Fragment

Intent intent = new Intent(OtherActivity.this, MainActivity.class);
intent.putExtra("id",1);
startActivity(intent);

然后,我们在MainActivity里接收id值, 对值进行判断, 如果正确进行跳转操作:

 int id = getIntent().getIntExtra("id", 0);
 if (id == 1) {      
      getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.fragment_container,new YourFragment())
        .addToBackStack(null)
        .commit(); 
 }

从一个Activity的Fragment跳转到另外一个Activity的Fragment上

这种跳转与第三种跳转极为类似, 我们只需要将上面的

Intent intent = new Intent(getActivity(), MainActivity.class);

写在对应的Fragment中, 其他不用改变.

展开阅读全文

没有更多推荐了,返回首页