Preciso de ajuda para trabalhar no fragmento dentro do fragmento, na verdade, estou enfrentando um problema ao pressionar o botão Voltar. A tela principal do aplicativo possui botões e, ao pressionar cada visualização de botão, substituir por novo fragmento (e esse fragmento contém dentro de outro fragmento); adicionar / substituir dinamicamente o fragmento está funcionando bem, pressionando o fragmento do botão 1 substituído, o mesmo acontece ao pressionar o botão, mas se eu pressionar o botão novamente, recebeu uma exceção:
"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"
significa que fragmentos ou fragmentos internos já foram adicionados e eu estou tentando adicioná-los novamente, alguém tem ideia de como trabalhar com fragmentos dentro de fragmentos e se mover para frente e para trás sem nenhum problema, obrigado pelo suporte.
MainActivity, onde fragmentos são dinâmicos adicionados e substituídos.
public class FragmentInsideFragmentTestActivity extends Activity {
private Button button1;
private Button button2;
private Button button3;
private Button button4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 =(Button) this.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button2 =(Button) this.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button3 =(Button) this.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button4 =(Button) this.findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
}
public void onButtonClick(View v) {
Fragment fg;
switch (v.getId()) {
case R.id.button1:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button2:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button3:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button4:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
}
}
private void replaceFragment(Fragment newFragment) {
FragmentTransaction trasection = getFragmentManager().beginTransaction();
if(!newFragment.isAdded()) {
try {
//FragmentTransaction trasection =
getFragmentManager().beginTransaction();
trasection.replace(R.id.linearLayout2, newFragment);
trasection.addToBackStack(null);
trasection.commit();
} catch (Exception e) {
// TODO: handle exception
// AppConstants.printLog(e.getMessage());
} else {
trasection.show(newFragment);
}
}
}
Aqui está o layout: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:text="Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button3"
android:text="Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button4"
android:text="Button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</LinearLayout>
Espero ter tentado resolver meu problema.
fonte
Respostas:
AFAIK, fragmentos não podem conter outros fragmentos.
ATUALIZAR
Com as versões atuais do pacote de suporte do Android - ou fragmentos nativos na API nível 17 e superior - você pode aninhar fragmentos por meio de
getChildFragmentManager()
. Observe que isso significa que você precisa usar a versão dos fragmentos do pacote de suporte do Android nos níveis de API 11-16, porque mesmo que exista uma versão nativa dos fragmentos nesses dispositivos, essa versão não possuigetChildFragmentManager()
.fonte
getChildFragmentManager()
e removersetRetainInstance(true)
do fragmento interno (pena) o consertou. Obrigado por salvar meu bacon novamente, @CommonsWare.Como precisava de mais contexto, fiz um exemplo para mostrar como isso é feito. A coisa mais útil que li durante a preparação foi esta:
Atividade
activity_main.xml
Adicione a
FrameLayout
à sua atividade para armazenar o fragmento pai.MainActivity.java
Carregue o fragmento pai e implemente os ouvintes do fragmento. (Veja comunicação por fragmentos .)
Fragmento pai
fragment_parent.xml
Adicione outro
FrameLayout
contêiner para o fragmento filho.ParentFragment.java
Use
getChildFragmentManager
emonViewCreated
configurar o fragmento criança.Fragmento de criança
fragment_child.xml
Não há nada de especial aqui.
ChildFragment.java
Também não há nada de especial aqui.
Notas
fonte
Como os fragmentos aninhados do Android 4.2 (API 17) ficam disponíveis http://developer.android.com/about/versions/android-4.2.html#NestedFragments
Para colocar um fragmento dentro de outro fragmento, use getChildFragmentManager ()
Também está disponível na biblioteca de suporte!
fonte
Fragmentos podem ser adicionados dentro de outros fragmentos, mas você precisará removê-lo do Fragmento pai sempre que o
onDestroyView()
método do fragmento pai for chamado. E, novamente, adicione-o no Parent FragmentonCreateView()
método .Apenas faça assim:
fonte
onActivityCreated()
foram adicionados dois fragmentos, um em cada uma das visualizações, usandogetFragmentManager()
. Isso funcionou pela primeira vez, mas na rotação e no resumo, apenas um dos fragmentos estava visível. O comportamento estava correto emgetChildFragmentManager()
vez disso. A abordagem sugerida aqui lançou uma exceção, pois a atividadeonSaveInstanceState()
já havia sido chamada. A confirmação da transaçãocommitAllowingStateLoss()
evitou a exceção, mas não resolveu o problema original.Eu resolvi esse problema. Você pode usar a biblioteca de suporte e
ViewPager
. Se você não precisar deslizar com um gesto, pode desativá-lo. Então, aqui está um código para melhorar minha solução:PSI É um código feio para teste, mas melhora que é possível.
O fragmento PPS Inside
ChildFragmentManager
deve ser passado paraViewPagerAdapter
fonte
você pode usar a
getChildFragmentManager()
funçãoexemplo:
Fragmento pai:
Layout pai (
parent_fragment.xml
):Fragmento de criança:
fonte
Não é nada complicado. Não podemos usar
getFragmentManager()
aqui. Para usar fragmentos dentro de um fragmento , usamosgetChildFragmentManager()
. O resto será o mesmo.fonte
Você pode adicionar
FrameLayout
ao fragmento e substituí-lo por outro fragmento quando inicializar.Dessa forma, você pode considerar o outro fragmento dentro do primeiro fragmento.
fonte
Use getChildFragmentManager (), siga o link: Fragmento aninhado
fonte
Atualmente no fragmento aninhado, o (s) aninhado (s) só é suportado se forem gerados programaticamente! Portanto, neste momento, nenhum layout de fragmento aninhado é suportado no esquema de layout xml!
fonte
Isso pode ajudar quem trabalha no Kotlin. Você pode usar a função de extensão, então crie um arquivo kotlin, digamos "util.kt" e adicione este pedaço de código.
Digamos que esta é a classe da criança
Agora você pode adicionar os filhos ao fragmento pai como este
onde R.id.fragmet_field é o ID do layout que conterá o fragmento. Esse lyout está dentro do fragmento pai, é claro. Aqui está um exemplo
father_fragment.xml :
fonte
Não há suporte para
MapFragment
, a equipe do Android diz que está trabalhando desde o Android 3.0. Aqui estão mais informações sobre o problema. Mas o que você pode fazer criando um fragmento que retorna aMapActivity
. Aqui está um exemplo de código. Graças a inazaruk:Como funciona :
FragmentActivity
e hospeda dois MapFragments.MapView.
LocalActivityManagerFragment
hospeda LocalActivityManager.LocalActivityManagerFragment
e, com a ajuda deTabHost
cria uma instância interna de MyMapActivity.Se você tiver alguma dúvida, por favor me avise
fonte
Olá, eu resolvi esse problema colocando por fragmento em um layout distinto. E fiz apenas um layout relacionado visível e fiz com que as outras visibilidades desaparecessem.
Quero dizer:
Eu assumi que você abriria sua página quando o botão 1 fosse clicado. Você pode controlar as visibilidades de seu fragmento ao clicar em ação. Você pode tornar o Layout relacionado visível e os outros desaparecidos e, pelo Fragment Manager, você pode pegar seu fragmento. Essa abordagem funcionou para mim. E como a visão que tem visibilidade: ido é invisível e não ocupa espaço para fins de layout, acho que essa abordagem não causa nenhum problema de espaço.
PS: Eu apenas tentei explicar o código da minha solução pode ter erros de sintaxe ou estrutura incompleta.
fonte