通过代码在FragmentAcivity内变换Fragment遇到的一些问题

From:http://www.it165.net/pro/html/201402/9366.html

  • 先上一段代码。

    TestFragmentActivity.java

    01. package com.xc.fragment;
    02. import com.xc.activity.R;
    03. import android.os.Bundle;
    04. import android.support.v4.app.FragmentActivity;
    05. import android.support.v4.app.FragmentManager;
    06. import android.support.v4.app.FragmentTransaction;
    07. public class TestFragmentActivity extends FragmentActivity {
    08. @Override
    09. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. setContentView(R.layout.fragment_activity);
    12. FragmentManager fragmentManager = getSupportFragmentManager();
    13. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    14. fragmentTransaction.add(R.id.fragment, new TestFragment());
    15. fragmentTransaction.commit();
    16. }
    17. }

    fragment_activity.xml

    01. <?xml version="1.0" encoding="utf-8"?>
    02. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    03. android:layout_width="fill_parent"
    04. android:layout_height="fill_parent"
    05. android:orientation="vertical" >
    06. <LinearLayout
    07. android:id="@+id/fragment"
    08. android:layout_width="fill_parent"
    09. android:layout_height="fill_parent"
    10. android:layout_marginTop="50dip" />
    11. </LinearLayout>

     

    TestFragment.java

    01. package com.xc.fragment;
    02. import android.os.Bundle;
    03. import android.support.v4.app.Fragment;
    04. import android.view.LayoutInflater;
    05. import android.view.View;
    06. import android.view.ViewGroup;
    07. import android.widget.TextView;
    08. import com.xc.activity.R;
    09. public class TestFragment extends Fragment {
    10. @Override
    11. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    12. TextView view = (TextView) inflater.inflate(R.layout.fragment, null);
    13. view.setText("oooooooooo");
    14. return view;
    15. }
    16. }

    fragment.xml

    1. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:id="@+id/text"
    3. android:layout_width="fill_parent"
    4. android:layout_height="fill_parent"
    5. android:text="lalall" />

     

     

    1。上述代码可以正常运行。出现“oooooooooo”

    2。若将TestFragment.java中的代码替换为:

    1. View view = inflater.inflate(R.layout.fragment, null);

    出现“lalall”

    3。若将TestFragment.java中的代码替换为:

    1. View view = inflater.inflate(R.layout.fragment, container);

    出错:The specified child already has a parent. You must call removeView() on the child's parent first.

    那么根据提示移除父组件里的子布局:

    1. View view = inflater.inflate(R.layout.fragment, container);
    2. ((ViewGroup)view.getParent()).removeView(view);

    不出错,但什么也不出现,因为view已经被移除了。

    4。若将TestFragment.java中的代码替换为:

    1. View view = inflater.inflate(R.layout.fragment, container, false);

    出现“lalall”

    若改为:

    1. View view = inflater.inflate(R.layout.fragment, container, false);
    2. ((TextView)view).setText("!!!!");

    出现“!!!!”

    5。若将TestFragment.java中的代码替换为:

    1. View view = inflater.inflate(R.layout.fragment, container, true);

    出现和3一样的错误。true和false起到决定性作用。

    6。若将TestFragment.java中的代码替换为:

    1. View view = inflater.inflate(R.layout.fragment, container, true);
    2. ((TextView)view).setText("!!!!");

    出错:android.widget.LinearLayout cannot be cast to android.widget.TextView。

    若保持上述代码不动,改变fragment_acivity.xml中的代码:

    1. <RelativeLayout
    2. android:id="@+id/fragment"
    3. android:layout_width="fill_parent"
    4. android:layout_height="fill_parent"
    5. android:layout_marginTop="50dip" />

    出错:android.widget.RelativeLayout cannot be cast to android.widget.TextView。

    这说明view已经被add到TestFragmentActivity中,并且随着父组件container变化。

    7。若将fragment.xml中代码改变为:

    01. <?xml version="1.0" encoding="utf-8"?>
    02. <merge xmlns:android="http://schemas.android.com/apk/res/android"
    03. android:layout_width="fill_parent"
    04. android:layout_height="fill_parent"
    05. android:orientation="vertical" >
    06. <TextView
    07. android:id="@+id/text"
    08. android:layout_width="fill_parent"
    09. android:layout_height="fill_parent"
    10. android:text="lalall" />
    11. </merge>

    TestFragment.java中代码改变为:

    1. View view = inflater.inflate(R.layout.fragment, nulltrue);

    或:

    1. View view = inflater.inflate(R.layout.fragment, container, false);

    或:

    1. View view = inflater.inflate(R.layout.fragment, null);

    都会出错:<merge /> can be used only with a valid ViewGroup root and attachToRoot=true。

    于是改成:

    1. View view = inflater.inflate(R.layout.fragment, container, true);

    出错:The specified child already has a parent. You must call removeView() on the child's parent first。

     

    结论:

    1。inflater.inflate(R.layout.fragment, null)类似于inflater.inflate(R.layout.fragment, container, false);

    2。inflater.inflate(R.layout.fragment, container, true)类似于inflater.inflate(R.layout.fragment, container)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值