Quero adicionar um fragmento a uma atividade que implemente seu layout programaticamente. Examinei a documentação do fragmento, mas não há muitos exemplos que descrevam o que eu preciso. Aqui está o tipo de código que tentei escrever:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Esse código compila, mas falha no início, provavelmente porque o meu FragmentTransaction.add()
está incorreto. Qual é a maneira correta de fazer isso?
fonte
ft.add(android.R.id.content, newFragment)
. Só é necessário criar um layout personalizado e definir seu ID se o contêiner do fragmento não for a visualização de conteúdo da atividade.Aqui está o que eu inventei depois de ler o comentário de Tony Wong :
...
...
Kotlin
Se você estiver usando o Kotlin, verifique o que as extensões Kotlin do Google fornecem ou apenas escreva as suas.
fonte
if (savedInstanceState == null)
antes da criação do fragmento, ou depois de girar uma tela, você terá dois fragmentos ou novos fragmentos. Não use oadd
método! Sóreplace
. Ou você terá um comportamento estranho.backStackStateName
string é algo que você define.main.xml
fonte
Depois de ler todas as respostas, vim com uma maneira elegante:
basicamente, você não precisa adicionar um frameLayout como contêiner do seu fragmento. Em vez disso, você pode adicionar diretamente o fragmento ao contêiner View da raiz do Android.
IMPORTANTE: não use o fragmento de substituição como a maioria das abordagens mostradas aqui, a menos que você não se importe em perder o estado da instância da variável de fragmento durante o processo de recriação .
fonte
usar
fonte
Para o nível 17 da API ou superior,
View.generateViewId()
resolverá esse problema. O método utilitário fornece um ID exclusivo que não é usado no tempo de construção.fonte
Para anexar fragmentos a uma atividade programaticamente no Kotlin, você pode observar o seguinte código:
MainActivity.kt
activity_main.xml
FragmentName.kt
Se você estiver familiarizado com Extensões no Kotlin, poderá melhorar ainda mais esse código, seguindo este artigo.
fonte