Activity动态添加Fragment

MainActivity的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <include layout="@layout/main_head" />

    <LinearLayout
        android:id="@+id/add_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"/>


</LinearLayout>

MainActivity主要代码:

public class MainActivity extends ActionBarActivity implements OnClickListener {
    private ImageButton mTabWeixin;
    private ImageButton mTabFriend;
    private ImageButton mTabDiscover;
    private ImageButton mTabMe;

    private ContentFragment mWeiXinFragment;
    private FriendFragment mFriendFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        initView();
    }

    public void initView() {
        // 初始化控件和声明事件
        mTabWeixin = (ImageButton) findViewById(R.id.weixin);
        mTabFriend = (ImageButton) findViewById(R.id.friend);
        mTabWeixin.setOnClickListener(this);
        mTabFriend.setOnClickListener(this);

        // 设置默认的Fragment
        setDefaultFragment();
    }

    @SuppressLint("NewApi")
    private void setDefaultFragment() {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        mWeiXinFragment = new ContentFragment();
        transaction.replace(R.id.id_content, mWeiXinFragment);
        transaction.commit();
    }

    @SuppressLint("NewApi")
    @Override
    public void onClick(View v) {
        FragmentManager fm = getFragmentManager();
        // 开启Fragment事务
        FragmentTransaction transaction = fm.beginTransaction();
        switch (v.getId()) {
            case R.id.weixin:
                if (mWeiXinFragment == null) {
                    mWeiXinFragment = new ContentFragment();
                }
                // 使用当前Fragment的布局替代id_content的控件
                transaction.replace(R.id.id_content, mWeiXinFragment);
                break;
            case R.id.friend:
                if (mFriendFragment == null) {
                    mFriendFragment = new FriendFragment();
                }
                transaction.replace(R.id.id_content, mFriendFragment);
                break;
        }
        // transaction.addToBackStack();
        // 事务提交
        transaction.commit();
    }
}

API:

5、Fragment常用的API:

Fragment常用的三个类:

android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add() 

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示之前隐藏的Fragment

detach()

将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例

attach()

将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次

transatcion.commit()//提交一个事务

注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。

上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。


### 回答1: Activity动态加载Fragment可以通过以下步骤实现: 1. 在Activity中定义一个Fragment容器,可以是FrameLayout或其他布局容器。 2. 在Activity中创建一个Fragment实例。 3. 使用FragmentManager将Fragment添加到容器中。 4. 如果需要,可以使用Bundle传递参数给Fragment。 5. 在Fragment实现相应的逻辑和UI。 6. 如果需要,可以在Activity中通过FragmentManager动态替换Fragment。 示例代码: 在Activity中定义一个Fragment容器: ``` <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 在Activity中创建一个Fragment实例: ``` MyFragment fragment = new MyFragment(); ``` 使用FragmentManager将Fragment添加到容器中: ``` getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, fragment) .commit(); ``` 如果需要,可以使用Bundle传递参数给Fragment: ``` Bundle args = new Bundle(); args.putString("key", "value"); fragment.setArguments(args); ``` 在Fragment实现相应的逻辑和UI: ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // TODO: 实现相应的逻辑和UI return view; } } ``` 如果需要,可以在Activity中通过FragmentManager动态替换Fragment: ``` MyFragment newFragment = new MyFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, newFragment) .commit(); ``` ### 回答2: 在Android的应用中,Fragment是一种非常重要的组件,它可以为应用带来更简约的UI和更清晰的代码架构。而动态加载Fragment,就可以让应用更具有灵活性和可扩展性,因为运行时可以根据需要动态添加或移除Fragment。 那么,具体该如何动态加载Fragment呢? 1. 定义Fragment:首先需要定义所要加载的Fragment类,一般情况下应该继承自Fragment类,如果需要支持低版本的Android平台,也可以选择继承自v4包中的Fragment类。 2. 在Activity添加Fragment:在Activity的布局文件中通过一个容器(比如FrameLayout)为Fragment提供一个载体。然后,我们可以通过FragmentTransaction类来动态添加和移除FragmentFragmentTransaction提供了较为完整的API方法,包括添加、移除、替换、显示隐藏等操作。 3. 设置Fragment参数:在加载Fragment时,还可以设置其初始化参数。一般情况下,我们会为Fragment定义工厂方法,以便于在创建Fragment时进行参数初始化。这样既能满足代码分离的原则,也能保证Fragment的可复用性。 4. Fragment交互:在Fragment中使用getActivity()方法可以获取到其所在的Activity对象,然后通过该对象和回调接口可以实现Activity的通信。同时,在Activity中也可以通过FragmentManager类获取到已被添加Fragment对象,从而实现各个Fragment之间的通信。 总之,动态加载Fragment能够提高Android应用程序的灵活性和可扩展性,同时可以使代码更简洁、低耦合,从而提高开发效率和代码可维护性。同时,Fragment作为Android的核心组件,对于Android应用的UI设计和代码结构都具有重要的意义,开发人员应该深入了解Fragment的使用方法和特性,进而提高自己的开发能力。 ### 回答3: 动态加载Fragment是Android开发中经常使用的技术之一。通常,页面中的一部分需要根据用户的交互而动态加载并显示,这时候就需要使用Fragment实现。因此,动态加载Fragment适用于那些需要根据不同的用户操作或者状态实时更新显示内容的页面。 在实现动态加载Fragment的过程中,需要使用FragmentManager以及FragmentTransaction两个类来完成。具体步骤如下: 1. 创建Fragment类和布局文件 首先需要创建Fragment类以及对应的布局文件。这个过程和创建Activity类和布局文件类似。Fragment是一种“子页面”,因此布局文件需要包含所有需要显示的组件。 2. 在Activity中调用FragmentManager获取FragmentTransaction 在Activity的onCreate方法中,调用FragmentManager的beginTransaction()方法获取FragmentTransaction对象。 3. 使用FragmentTransaction添加(或替换)Fragment 根据需求,可以使用FragmentTransaction的add()方法添加Fragment,或者使用replace()方法替换已存在的Fragment。这两个方法需要传入两个参数:要添加或者替换的Fragment实例,以及对应的布局文件ID。 4. 使用FragmentTransaction提交事务 在添加或者替换Fragment之后,需要通过FragmentTransaction的commit()方法提交事务,使修改生效。 以上步骤就是实现动态加载Fragment的基本流程。当然,在实际开发中还需要考虑诸如Fragment的生命周期、保存Fragment状态等问题。同时,还可以根据需求使用其他一些方法,如hide()和show()方法在多个Fragment之间切换,detach()和attach()方法将Fragment从布局中移除等等。 总的来说,动态加载Fragment是一项非常重要的技术,可以帮助开发者更加灵活地控制页面的显示和交互。掌握相关知识可以大大提高应用程序的用户体验和开发效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值