2013-06-02 26 views
14

'da boş bir kapsayıcıya verilmiştir Android geliştiricileri web sitesindeki eğiticiye benzer şekilde Android parçalarını çok basit bir şekilde kullanmaya çalışıyorum. İşte Android Fragmanı onCreateView()

public class MediaInfoActivity extends FragmentActivity { 
    private final String TAG = "MediaInfoActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate()"); 
     setContentView(R.layout.media_info_activity_layout); 
    } 

} 

media_info_activity_layout.xml dosyası için kodudur: sonunda burada

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <fragment class="com.hawkforce.test.MediaInfoFragment" 
      android:id="@+id/mediaInfoFragment" 
      android:layout_weight="1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" /> 

    <FrameLayout android:id="@+id/mediaPlayerBarPanel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 

    <fragment class="com.hawkforce.test.MediaPlayerBarFragment" 
       android:id="@+id/mediaPlayerBar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 

    </FrameLayout> 

Ve edilir

Aşağıdaki kod ile bir Aktivite (MediaInfoActivity) sahip MediaInfoFragment kodu:

public class MediaInfoFragment extends Fragment { 
    private final static String TAG = "MediaInfoFragment"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate()"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     Log.i(TAG, "onCreateView()"); 
     if (container == null) { 
      Log.i(TAG, "onCreateView(): container = null"); 
     } 

     return inflater.inflate(R.layout.media_info_fragment_layout, container, false); 
    } 

} 

İşte benim sorunum: MediaInfoFragment'in onCreateView() yönteminde iletilen kapsayıcı boş. Anladığım kadarıyla, bu sadece UI olmayan Fragmanlar için geçerli olmalıdır. Ancak, benim Fragmentim MediaInfoActivity'i başlattığımda ekranda OK yazan bir UI'ye sahip. Bu, parçanın xml düzen dosyasında bildirilen bir stil uygulanmadığı için sorunlara neden olur. Burada bariz bir şey eksik

I/MediaInfoActivity: onCreate() 
I/MediaInfoFragment: onCreate() 
I/MediaInfoFragment: onCreateView() 
I/MediaInfoFragment: onCreateView(): container = null 

Am: Burada

benim Günlüğü nedir?

+0

Yanlış kullanıyorsunuz, buna kapsayıcınıza takılı demektir. –

+0

İhlalde demek istiyorsun, değil mi? Onu doğru olarak değiştirdim ama değişiklik olmadı. Artı bu satır: 'onCreateView(): container = null', inflater çağrısından önce gösterilir. Benim sorunum, Android'in onCreateView() için ikinci bir argüman olarak null değerini geçmesi ve bunun nereden geldiğini anlamaması. – HawkForce

+0

- http://stackoverflow.com/questions/27306805/android-fragment-oncreateview-container-is-null - http://stackoverflow.com/questions/24589202/android-fragments-container-variable-in- oncreateview-olduğu boş – pRaNaY

cevap

2

Ben önümde SDK kod olmadığı için emin değilim ama Fragment "onCreateView" çağıran yaşam döngüsü fonksiyonu iki dava arasında farklı olduğunu düşünüyorum: 1. Düzendeki parçanın statik ayarları 2. FragmentManager ile pragmatik olarak yükleniyor. (setContentView:

çağrı: İlk durumda

ayıklayıcı onCreate() kod parçası olarak ana etkinliğe içerik görüntüsü ekleme hemen sonra Fragment.onCreateView() yöntemi içine almak R.layout.some_layoue);
İkinci durumda sonraki satıra

için Fragment.onCreateView()onCreate (sonra ancak çağrılan ediliyor) ait gitmeden önce ayıklayıcı Fragment.onCreateView() içine almak göreceksiniz etkinlik bitti.

Bu benim için tasarım hatası gibi görünüyor ama muhtemelen tasarım özelliği olarak. Her neyse, ilgili nesne henüz oluşturulmadığından statik olarak parça eklerken kapsayıcı boştur. Aslında iki durum arasındaki fark çok daha derindir. Parçalar arasında geçiş yapan statik parçacıklar durumunda, görünüm hiyerarşisini doğru şekilde oluşturmaz.bir kod (sadece ilgili kodu vurgulama) şöyle ile size parçası A ve düğme-B'ye düğme-A katacak Örneğin

parçaları Parçalara-B ve geçiş yapmak için:

public void turnOnFragment() { 
    FragmentManager manager = getFragmentManager(); 
    if (manager != null) { 
     manager.beginTransaction() 
       .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) 
       .attach(this) 
       .commit(); 
    } 
} 



public void turnOffFragment() { 
    FragmentManager manager = getFragmentManager(); 
    if (manager != null) { 
     manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     manager.beginTransaction() 
       .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) 
       .detach(this) 
       .commit(); 


    } 
} 

Sen Statik fragmanlarda her iki parçanın düğmelerinin açılıp kapanmasına rağmen sunulduğunu göreceksiniz. Bununla birlikte, parçaların programatik olarak eklenmesi durumunda, geçiş, iyi çalışır ve görünüm hiyerarşisi temizlenir ve yalnızca ilgili parçadan düğmeyi gösterir.

Bu sürümde 4.4.2 Sadece kendi fragmanında bağırma gibi bir Inflater oluşturmak zorunda

3

ile benim deneyim dayanmaktadır.

View rootView; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if (rootView == null) { 
     rootView = inflater.inflate(R.layout.activity_my_cart, null); 
    } else { 
     ((ViewGroup) container.getParent()).removeView(rootView); 
    } 
    return rootView; 
} 

Umarım sorunuza göre çalışır.

İlgili konular