2013-05-23 12 views
5

EDIT: Bazı deneylerden sonra, ilk parçayı xml düzenine eklemediğimde beklendiği gibi çalışıyor gibi görünüyor. Şimdi etkinlik kaynak kodumda yapıyorum. Sanırım bunu nasıl yapacağımı tahmin ettim?parça kullanım ömrü: onCreateView() geri düğmesi kullanıldığında çağrılmıyor

http://developer.android.com/guide/components/fragments.html#Creating'a göre, bir parça kaldırılır ve sonra tekrar eklenirse, onCreateView() çağrılmalıdır.

Ayrıca getView() işlevinin null değerini döndürdüğünü de görüyorum.

durumda
--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 

Burada, yanlış bir şey yapıyorum geçerli: onDestroyView() denir ama benim ilk fragmanın arayüz buraya

basıldığında görüntülenen hala benim örnek kod sonucudur

benim 2 fragmanı sınıfları:: bazı temel kod benim sorunu yeniden oluşturmak için

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()); 
    }  
} 

ve

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"); 
    }  
} 

ana faaliyet

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); 
    } 
} 

ve burada 3 düzenleri vardır çok basittir

<?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

Onlarla işlem yapmayı planlıyorsanız, parçaları xml düzeninde bildirmeyin. – Luksprog

+0

teşekkürler. daha sonra anladım. – medmed

+0

Benzer bir sorun yaşıyorum. Bir sekmeyi silip yeni bir tane oluşturmayı denediğimde, 'onCreateView' adını vermez. Bunu üstesinden gelmeyi nasıl önerirsiniz? –

cevap

1

Sistem bu main.xml düzenini oluşturduğunda, düzende belirtilen parçayı örneklendirir ve her parçanın düzenini almak için onCreateView() yöntemini çağırır. daha sonra aynı fragman örneklerini kullanacaktır. Yani, tekrar OnCreateView çağırmayacak.

Yeniden oluşturmak isterseniz, Etkinliğinizden bir FragmentTransaction örneği alın ve istediğiniz gibi uygulayın.

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

deneyin BackPress olaydan önce FragmentTransaction.remove(your fragment) kullanılarak FragmentManager yığınından fragmanı kaldırın.

veya sadece yeni parçayı yüklemek için FragmentTransaction.replace() kullanın.

İlgili konular