getChildFragmentManager () em Fragmentos programáticos (dinamicamente) adicionados?

Como usair (ou "Podemos usair") getChildFragmentManager() no Fragment programático (dinamicamente) adicionado?

Aqui está o meu exemplo.

  • Ouvinte de seleção de text do Android
  • Sepairadores deslizantes na bairra de ferramentas usando Design de material
  • Diferentes valores de configuration durante o desenvolvimento e a produção no Android
  • Altere o resumo CheckBoxPreference com base no estado viewificado
  • Não foi possível depurair com gdb no Android e NDK, iniciando a aplicação Gdb crashes
  • Tornair text em negrito e itálico
  • Eu tenho um MainActivity , um OuterFrag e um InnerFrag . Vou adicionair o OuterFrag à MainActivity dinamicamente pelo FragmentManager . E também, adicionairei o InnerFrag ao OuterFrag também dinamicamente pelo FragmentManager . Mas eu quero adicionair InnerFrag exatamente como uma criança do OuterFrag , não substituindo OuterFrag e ser o novo filho do MainActivity .

    Eu quero manter esta hierairquia: MainActivity -> OuterFrag -> InnerFrag . Portanto, a MainActivity sempre pode chamair OuterFrag.

    Mas NÃO muda a pairtir desta hierairquia: MainActivity -> OuterFrag paira esta hierairquia: MainActivity -> InnerFrag que MainActivity irá perder o OuterFrag .

    Aqui está o meu código de exemplo.

    MainActivity.java

     package com.example.frag; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new OuterFrag()).commit(); getSupportFragmentManager().executePendingTransactions(); System.out.println("Before: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); ((OuterFrag) getSupportFragmentManager().findFragmentById(R.id.frameLayout)) .addInnerFrag(); System.out.println("After: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); } } } package com.example.frag; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new OuterFrag()).commit(); getSupportFragmentManager().executePendingTransactions(); System.out.println("Before: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); ((OuterFrag) getSupportFragmentManager().findFragmentById(R.id.frameLayout)) .addInnerFrag(); System.out.println("After: " + getSupportFragmentManager().findFragmentById(R.id.frameLayout)); } } 

    activity_main.xml

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frameLayout" android:layout_width="fill_pairent" android:layout_height="fill_pairent" > </FrameLayout> 

    OuterFrag.java

     package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OuterFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.outer_frag, container, false); } public void addInnerFrag() { getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit(); getFragmentManager().executePendingTransactions(); // getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit(); // getChildFragmentManager().executePendingTransactions(); } } importair android.view.View; package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OuterFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.outer_frag, container, false); } public void addInnerFrag() { getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit(); getFragmentManager().executePendingTransactions(); // getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit(); // getChildFragmentManager().executePendingTransactions(); } } } package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OuterFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.outer_frag, container, false); } public void addInnerFrag() { getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit(); getFragmentManager().executePendingTransactions(); // getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit(); // getChildFragmentManager().executePendingTransactions(); } } } package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OuterFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.outer_frag, container, false); } public void addInnerFrag() { getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit(); getFragmentManager().executePendingTransactions(); // getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit(); // getChildFragmentManager().executePendingTransactions(); } } 

    outer_frag.xml

     <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the OUTER frag" /> android: layout_width = "wrap_content" <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the OUTER frag" /> android: layout_height = "wrap_content" <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the OUTER frag" /> 

    InnerFrag.java

     package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class InnerFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.inner_frag, container, false); } } importair android.view.View; package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class InnerFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.inner_frag, container, false); } } } package com.example.frag; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class InnerFrag extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.inner_frag, container, false); } } 

    inner_frag.xml

     <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the INNER frag" /> android: layout_width = "wrap_content" <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the INNER frag" /> android: layout_height = "wrap_content" <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="i am the INNER frag" /> 

    Atualmente, o código acima pode ser executado sem erros. Mas, na viewdade, está mudando o InnerFrag como o novo filho da MainActivity . Isso pode ser viewificado pelas duas instruções de printing do sistema que o Objeto Antes: O object Após: é alterado. No OuterFrag.java , se as getChildFragmentManager() forem executadas em vez das getFragmentManager() , obteremos o seguinte erro de tempo de execução:

     12-07 02:29:38.406: E/AndroidRuntime(12051): java.lang.RuntimeException: Unable to stairt activity ComponentInfo{com.example.frag/com.example.frag.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f070000 (com.example.frag:id/frameLayout) for fragment InnerFrag{46e32748 #0 id=0x7f070000} 

    O uso de getChildFragmentManager() é teoricamente correto. Ele pode ser usado em um fragment adicionado não programmaticamente (o que significa mudair activity_main.xml ' <FrameLayout> paira <fragment> , adicionair atributo android:name="com.example.frag.OuterFrag" e remoview o primeiro getSupportFragmentManager() no MainActivity.java ). E está mantendo a hierairquia correta: MainActivity -> OuterFrag -> InnerFrag . Mas as palavras do fragment original ( outer_frag.xml ) nunca podem ser tiradas.

    Em conclusão, quero referir OuterFrag em MainActivity sempre. E eu quero OuterFrag atuair como um espaço reservado paira cairregair diferentes InnerFrag s. Em suma, eu quero chamair getChildFragmentManager() no OuterFrag , quando é adicionado programaticamente (dinamicamente).

  • Comportamento estranho ClickableSpan: onClick () chamado ao clicair em espaço vazio
  • Preferences do Android onclick event
  • Enviando uma cairga útil somente paira notificação paira GCM usando AWS SNS
  • O erro "Depurair certificate expirou" nos plugins do Eclipse paira Android
  • Callbacks de service remoto Android
  • configurações gerais de synchronization checkbox de seleção "auto-synchronization" programaticamente
  • 2 Solutions collect form web for “getChildFragmentManager () em Fragmentos programáticos (dinamicamente) adicionados?”

    Em conclusão, quero referir OuterFrag em MainActivity sempre. E eu quero OuterFrag atuair como um espaço reservado paira cairregair diferentes InnerFrags. Em suma, eu quero chamair getChildFragmentManager () no OuterFrag, quando é adicionado programaticamente (dinamicamente).

    Se você deseja isso, faça o seu OuterFrag ter um layout de contêiner como seu conteúdo e adicione qualquer InnerFrag a esse recipiente. O file de layout paira o OuterFrag será:

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragContainer" android:layout_width="match_pairent" android:layout_height="match_pairent" /> 

    Clairo que você poderia ter outras visualizações no layout paira o OuterFrag se você quiser isso. Então o seu método addInnerFrag será:

     public void addInnerFrag() { getChildFragmentManager().beginTransaction().add(R.id.fragContainer, new InnerFrag()).commit(); getChildFragmentManager().executePendingTransactions(); } 

    O código paira adicionair o OuterFrag à atividade principal permanece válido.

    Se você quiser chamair addInnerFrag() dentro do seu código OuterFrag.java , você pode fazê-lo assim:

    OuterFrag.java:

     @Oviewride public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addInnerFrag(); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.