2013-05-23 15 views
5

EDIT:いくつかの実験の後、xmlレイアウトに初期フラグメントを追加しないと、期待どおりに動作するように見えます。私は今、私の活動のソースコードでそれをやっています。私はこれが私がそれをやると予想された方法だと思いますか?フラグメントライフサイクル:バックボタンを使用するとonCreateView()が呼び出されない

http://developer.android.com/guide/components/fragments.html#Creatingによれば、フラグメントが削除されてから戻されると、onCreateView()を呼び出す必要があります。

getView()がnullを返すこともわかります。 onDestroyView()が呼び出されますが、バック

押されたときに私の最初のフラグメントのインタフェースはまだここに表示されている私のサンプルコードの結果である:私はここに、何か間違ったことをやっている場合

--launch app 
I/System.out(3765): ==== FRAGMENT1.ONCREATE 
I/System.out(3765): ==== FRAGMENT1.ONCREATEVIEW 
I/System.out(3765): ==== FRAGMENT1.ONACTIVITYCREATED (FRAGMENT1.getView = [email protected] 

--second fragment 
I/System.out(3765): ==== FRAGMENT2.ONCREATE 
I/System.out(3765): ==== FRAGMENT2.ONCREATEVIEW 
I/System.out(3765): ==== FRAGMENT2.ONACTIVITYCREATED 

--back is pressed : getView() == null and onCreateView is not called 
I/System.out(3765): ==== FRAGMENT1.ONACTIVITYCREATED (FRAGMENT1.getView = null 

されます私の問題を再現するためにいくつかの基本的なコード:

私の2つのフラグメントのクラス:

package com.test.testbackfragment; 

import android.support.v4.app.Fragment; 
import android.view.ViewGroup; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 

public class Fragment1 extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("==== FRAGMENT1.ONCREATE"); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
     System.out.println("==== FRAGMENT1.ONCREATEVIEW"); 
     View v = inflater.inflate(R.layout.fragment1, container, false); 

     v.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        getActivity().getSupportFragmentManager().beginTransaction() 
         .remove(Fragment1.this) 
         .add(R.id.fragment, new Fragment2()) 
         .addToBackStack(null) 
         .commit(); 
       } 
      }); 
     return v; 
    }   

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     System.out.println("==== FRAGMENT1.ONACTIVITYCREATED (FRAGMENT1.getView = "+getView()); 
    }  
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    <fragment android:name="com.test.testbackfragment.Fragment1" 
      android:id="@+id/fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
</LinearLayout> 

fragment1.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#0000FF"> 
    <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="20dip" 
      android:text="THIS IS FRAGMENT1" /> 

    <Button 
      android:id="@+id/button" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="20dip" 
      android:text="FRAGMENT2"/> 
</LinearLayout> 

fragment2.xml

package com.test.testbackfragment; 

import android.support.v4.app.Fragment; 
import android.view.ViewGroup; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 

public class Fragment2 extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("==== FRAGMENT2.ONCREATE"); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
     System.out.println("==== FRAGMENT2.ONCREATEVIEW"); 
     View v = inflater.inflate(R.layout.fragment2, container, false); 
     return v; 
    }   

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     System.out.println("==== FRAGMENT2.ONACTIVITYCREATED"); 
    }  
} 

主な活動は

package com.test.testbackfragment; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 

public class MainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

、ここでは3つのレイアウトされている非常に簡単です

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#00FF00"> 
    <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="20dip" 
      android:text="THIS IS FRAGMENT2" /> 
</LinearLayout> 
+6

フラグメントをトランザクションとする予定がある場合は、XMLレイアウトでフラグメントを宣言しないでください。ありがとう。 – Luksprog

+0

これは私が後で考えたものです。 – medmed

+0

私は同様の問題を抱えています。タブを削除して新しいタブを作成しようとすると、 'onCreateView'は呼び出されません。どのように私はそれを克服することをお勧めしますか? –

答えて

1

このmain.xmlレイアウトを作成すると、レイアウトで指定されたフラグメントがインスタンス化され、onCreateView()メソッドが呼び出されて各フラグメントのレイアウトが取得されます。後で同じフラグメントのインスタンスを使用します。したがって、OnCreateViewは再び呼び出されません。

再度作成する場合は、アクティビティからFragmentTransactionのインスタンスを取得し、好きなように実装します。

FragmentManager fragmentManager = getFragmentManager() 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction .replace(R.id.fragment, newFragment); 
// Commit the transaction 
transaction.commit(); 
0

BackPressイベントの前に FragmentTransaction.remove(your fragment)を使用してFragmentManagerのスタックからの断片を削除するようにしてください。

またはFragmentTransaction.replace()を使用して新しいフラグメントをロードしてください。

関連する問題