Fragment使用findFragmentById返回null

今天换新版本的ADT之后默认建立工程引入Fragment,之前对Fragment没有做过了解。

想学习一下,在Activity的onCreate方法中无论怎么获取Fragment都是null,代码如下:

  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     Log.d(TAG, "" + "ActionBarActivity onCreate");  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.activity_jnitest);  
  5.   
  6.     if (savedInstanceState == null) {  
  7.         getSupportFragmentManager().beginTransaction()  
  8.                 .add(R.id.container, new PlaceholderFragment(), "myfragment")  
  9.                 .commit();  
  10.     }  
  11.     Log.d(TAG, "Fragment:"+getSupportFragmentManager().findFragmentById(R.id.container));  
    protected void onCreate(Bundle savedInstanceState) {
    	Log.d(TAG, "" + "ActionBarActivity onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jnitest);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment(), "myfragment")
                    .commit();
        }
        Log.d(TAG, "Fragment:"+getSupportFragmentManager().findFragmentById(R.id.container));

log打印出来是null,看过Fragment生命周期,知道这个时候可能Fragment还没创建完成有可能获取不到,换个地方试试,在Activity的onResume中,这里肯定创建完成。

  1. protected void onResume() {  
  2.     Log.d(TAG, "" + "ActionBarActivity onResume");  
  3.     Log.d(TAG, "Fragment:"+getSupportFragmentManager().<span style="font-family: Arial, Helvetica, sans-serif;">findFragmentById(R.id.container));</span>  
  4.   
  5.     // TODO Auto-generated method stub  
  6.     super.onResume();  
  7. }  
    protected void onResume() {
    	Log.d(TAG, "" + "ActionBarActivity onResume");
        Log.d(TAG, "Fragment:"+getSupportFragmentManager().<span style="font-family: Arial, Helvetica, sans-serif;">findFragmentById(R.id.container));</span>

    	// TODO Auto-generated method stub
    	super.onResume();
    }
结果打印出来依然是null,查看Google Developer明明说可以获取的。

public abstract Fragment findFragmentById (int id)
Added in  API level 11

Finds a fragment that was identified by the given id either when inflated from XML or as the container ID when added in a transaction. This first searches through fragments that are currently added to the manager's activity; if no such fragment is found, then all fragments currently on the back stack associated with this ID are searched.

Returns
  • The fragment if found or null otherwise.
我E文比较差,我的理解是说,只要通过transaction的时候,给定的容器ID就可以获取到啊,可是一直就是null。

google stackoverflow上也有人问类似的问题,但几乎所有人答复都是不能这么用,findFragmentById只能在XML标记的那个ID中可以使用。

也就是说只有通过类似如下代码可以通过R.id.list进行搜索:

  1. <fragment android:name="com.example.news.ArticleListFragment"  
  2.         android:id="@+id/list"  
  3.         android:layout_weight="1"  
  4.         android:layout_width="0dp"  
  5.         android:layout_height="match_parent" />  
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

也就是说目前剩下的只能通过findFragmentByTag来搜寻了,创建的时候加一个myfragment标签。

  1. if (savedInstanceState == null) {  
  2.     getSupportFragmentManager().beginTransaction()  
  3.             .add(R.id.container, new PlaceholderFragment(), "myfragment")  
  4.             .commit();  
  5. }  
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment(), "myfragment")
                    .commit();
        }
找到时候通过如下代码

  1. Log.d(TAG, "Fragment:"+getSupportFragmentManager().findFragmentByTag("myfragment"));  
Log.d(TAG, "Fragment:"+getSupportFragmentManager().findFragmentByTag("myfragment"));

遇到第二个问题是,我当时用的不是getSupportFragmentManager而是用的getFragmentManager结果获取的还是空。

我就搞不懂,getSupportFragmentManager和getFragmentManager的区别在哪里。

接着google之后,其实两个方法的功能是一模一样的,区别只在于版本的区别,假如你在AndroidManifest中配置的minSdk是小于14的,那么就应该使用getSupportFragmentManager。

如果是高于14(包含)的,就应该使用getFragmentManager。

原因在于使用的jar包不一样,我使用的是android-support-v4.jar。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值