Método de carregamento de fragmentos
Existem duas maneiras de carregar
- Cadastre-se no arquivo xml
- Carregar em código Java
Cadastre-se em xml :
Por exemplo, fragment_demo.xml
definido em
<?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
android:id="@+id/main_fragment_up"
android:name="com.rust.fragment.FirstFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<fragment
android:id="@+id/main_fragment_bottom"
android:name="com.rust.fragment.SecondFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
com.rust.fragment.SecondFragment
Ou seja, a subclasse Fragment SecondFragment.java
substitui onCreateView
o método e retorna a visualização definida.
Basta carregá-lo diretamente na atividade
setContentView(R.layout.fragment_demo);
Carregando em código Java
① Prepare o arquivo de layout xml do Fragment ② Crie uma nova classe, herdada do Fragment; encontre o arquivo de layout do Fragment nesta classe ③ Use o FragmentManager na Activity para operar o Fragment ④ Não se esqueça de confirmar
Primeiro personalize um arquivo de layoutfragment_first.xml
<?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"
android:background="#0011ff" >
<!-- <Button
android:id="@+id/btn_fragment1_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_fragment1"
android:textSize="16sp"
/>
<EditText
/> -->
</LinearLayout>
Crie uma nova classe FirstFragment.java
que herda de Fragment. Método de cópia onCreateView
. No onCreateView
método, você pode operar os controles no Fragmento.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_first, container,false);
// fragment_first是自定义好的布局
// 如果此Fragment上放了控件,比如Button,Edittext等。可以在这里定义动作
btn_fragment1_send = (Button) rootView.findViewById(R.id.btn_fragment1_1);
//...
return rootView;
}
Prepare uma posição para Fragment, como activity_main.xml
usar Framelayout para ocupar a posição.
<FrameLayout
android:id="@+id/layout_container1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4" >
</FrameLayout>
Em MainActivity.java
, primeiro obtenha o FragmentManager e depois o FragmentTransaction. Operações como adição e exclusão de Fragment são concluídas por FragmentTransaction.
f1 = new FirstFragment(); // 获取实例
f2 = new SecondFragment(); //
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.layout_container1,f1); // 添加
fragmentTransaction.replace(R.id.layout_container1,f1); // 替换
// 或者也可以写成
fragmentTransaction.replace(R.id.layout_container1,new FirstFragment());
// fragmentTransaction.addToBackStack(null); //添加到返回栈,这样按返回键的时候能返回已添加的fragment
fragmentTransaction.commit(); //别忘了commit
// 移除操作 getFragmentManager().beginTransaction().remove(f1).commit();
Comparado ao registro em xml, o carregamento do código é mais flexível. Pessoalmente, prefiro o carregamento dinâmico.
Cooperação entre Fragmento e Atividade
A atividade é executada primeiro
onResume
e, em seguida, oonResume
fragmento atual é executado. O fragmento atual é substituído e, quando é substituído novamente, alguns estados não são reinicializados. Quando a substituição for executada, o ciclo de declaração do Fragmento será executado novamente. Uma abordagem segura éonCreateView
inicializar as variáveis necessárias no . Por exemplo, redefina alguns valores de status. É necessária atenção especial ao alternar entre vários fragmentos.
Comunicação entre Fragmentos
No arquivo java do Fragment, você pode usar getActivity()
para obter a atividade que o chama e, em seguida, encontrar outro Fragment para se comunicar
getActivity().getFragmentManager().findFragmentById(R.id.fragment_list);
No entanto, este acoplamento é demasiado elevado e é inconveniente para operações de modificação subsequentes.
A comunicação entre um Fragmento e sua Atividade anexada deve ser completada pela Atividade; não pode ser uma comunicação direta entre vários Fragmentos.
Método de comunicação entre o Fragment e sua atividade anexada:
- Defina uma interface no Fragment que inicia o evento e declare seus métodos na interface
- Exigir que Activity implemente esta interface no método onAttach
- Implemente este método na atividade
Por exemplo, dois Fragmentos estão dispostos em uma atividade e a comunicação entre eles depende da atividade.
Código:ListStoreActivity.java
NewItemFragment.java
ListStoreFragment.java
O arquivo de layout é:liststore.xml
new_item_fragment.xml
Preparar arquivo de layout :
liststore.xml
Use LinearLayout para colocar 2 fragmentos, apontando para 2 arquivos Fragment respectivamente. new_item_fragment.xml
Coloque um EditText e um botão lado a lado.
ListStoreFragment.java
Use a interface definida anteriormente
public class ListStoreFragment extends ListFragment{
/// 继承自ListFragment,已经封装好了listview
/// 不需要自己写ListView了
}
NewItemFragment.java
/**
* 声明一个接口,定义向activity传递的方法
* 绑定的activity必须实现这个方法
*/
public interface OnNewItemAddedListener {
public void newItemAdded(String content);
}
private OnNewItemAddedListener onNewItemAddedListener;
private Button btnAddItem;
/*复写onAttach方法*/
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
onNewItemAddedListener = (OnNewItemAddedListener) activity;
} catch (ClassCastException e){
throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener");
}
}
ListStoreActivity.java
Carregue a visualização principal liststore.xml
;
Dois fragmentos ListStoreActivity
se comunicam através
Obtenha a instância de ListStoreFragment no método onCreate; substitua o método newItemAdded e adicione lógica de negócios nele
public class ListStoreActivity extends Activity implements OnNewItemAddedListener{
private ArrayList<String> data;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.liststore);
data = new ArrayList<String>();
// 把data装入adapter中
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
// ListFragment并不需要再定义一个listview
ListStoreFragment listStoreFragment = (ListStoreFragment) getFragmentManager().findFragmentById(R.id.fragment_listview);
listStoreFragment.setListAdapter(adapter);
}
@Override
public void newItemAdded(String content) {
// 复写接口中的方法,业务代码在这里实现
if(!content.equals("")) {
data.add(content);
adapter.notifyDataSetChanged();
}
}
}
A desvantagem disto é que o grau de acoplamento é muito alto
Vários métodos de comunicação entre Fragment e Activity
- A atividade entrega seu manipulador ao Fragment
- transmissão
- EventBus
- Definir interface
Além dos métodos mencionados acima, a comunicação também pode ser alcançada compartilhando ViewModel entre Activity e Fragment.
Compartilhe uma última vez
[Produzido pela equipe técnica da Tencent] Começando a usar o Android do zero até dominá-lo, tutorial de instalação do Android Studio + conjunto completo de tutoriais básicos do Android
Tutorial introdutório à programação Android
Noções básicas da linguagem Java, desde a entrada até a familiaridade
Noções básicas da linguagem Kotlin, desde a entrada até a familiaridade
Pilha de tecnologia Android desde a entrada até a familiaridade
Aprendizagem abrangente no Android Jetpack
Para iniciantes, pode ser difícil instalar o Android Studio. Você pode assistir ao vídeo a seguir para aprender como instalar e executá-lo passo a passo.
Tutorial de instalação do Android Studio
Com o estágio de aprendizado Java, é recomendável focar no aprendizado por vídeo neste estágio e complementá-lo com verificação de livros e preenchimento de lacunas. Se você se concentra principalmente em livros, pode digitar o código com base nas explicações do livro, complementado por vídeos didáticos para verificar omissões e preencher lacunas. Se você encontrar problemas, você pode ir ao Baidu. Geralmente, muitas pessoas encontrarão problemas básicos e darão respostas melhores.
Você precisa dominar pontos de conhecimento básico, como usar os quatro componentes principais, como criar um serviço, como fazer o layout, visualização personalizada simples, animação, comunicação em rede e outras tecnologias comuns.
Um conjunto completo de tutoriais baseados em zero foi preparado para você. Se precisar, você pode adicionar o código QR abaixo para obtê-lo gratuitamente.
Um conjunto completo de tutoriais básicos do Android