Contando com o java, estudo o Android há um ano. Desde o início da informação está cheia de confusão, não sei por quê? Mudar para o Android? Sem confiança alguma. Desistir? Meu trabalho duro durante um ano não foi desperdiçado? Nenhuma fofoca.
A maioria dos aplicativos tem uma barra de navegação na parte inferior, como WeChat e QQ. Eu costumava usar o textView para adicionar algumas coisas bagunçadas, o acoplamento de código é alto, a implementação é complicada e a reutilização é baixa. Como as coisas básicas estão quase aprendidas, recentemente começou a entrar em contato com alguns projetos simples e descobriu que a estrutura é realmente uma coisa boa. Embora seja mais difícil começar, é muito conveniente para manutenção posterior, reutilização de código e expansão horizontal ...
Esta é a barra inferior que extraí de um projeto de código aberto e implementei com o FragmentTabHost + RadioGroup e é separada para facilitar a pesquisa posterior. Vamos para a foto primeiro.
Fale brevemente sobre o princípio: os três botões inferiores são RadioGroup, o FragmentTabHost é conectado à visualização principal (a maior parte da tela) através do método de configuração, e o método addTab do FragmentTabHost pode adicionar Fragment ao FragmentTabHost para alternar a exibição. Em seguida, no monitoramento de eventos do RadioGroup, você pode alternar o Fragmento exibido pelo método setCurrentTab de FragmentTabHost.
Layout da atividade:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/frameLayout_nr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"></FrameLayout>
<android.support.v4.app.FragmentTabHost
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"></android.support.v4.app.FragmentTabHost>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rbHome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:button="@null"
android:checked="true"
android:drawablePadding="4dp"
android:drawableTop="@drawable/home"
android:gravity="center"
android:text="主页"
android:textColor="@drawable/text"
android:textSize="16sp" />
<RadioButton
android:id="@+id/rbMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:button="@null"
android:drawablePadding="4dp"
android:drawableTop="@drawable/message"
android:gravity="center"
android:text="信息"
android:textColor="@drawable/text"
android:textSize="16sp" />
<RadioButton
android:id="@+id/rbProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:button="@null"
android:drawablePadding="4dp"
android:drawableTop="@drawable/profile"
android:gravity="center"
android:text="我的"
android:textColor="@drawable/text"
android:textSize="16sp" />
</RadioGroup>
</LinearLayout>
O layout FrameLayout no layout é usado para associar o conteúdo de exibição FragmentTabHost, que é o maior bloco na tela mencionada acima.
Não há muito o que dizer sobre o FragmentTabHost, deve-se notar que o android: visibilidade = "foi", porque o FragmentTabHost era originalmente um layout de slider, não queremos exibir o slider, portanto o FragmentTabHost fica oculto na exibição. Por que colocar um componente e ocultá-lo? Como vamos usar alguns métodos do FragmentTabHost, em resumo, podemos usar o método setCurrentTab para alternar e exibir alguns fragmentos no FragmentTabHost que associamos com antecedência.O
próximo é um RadioGroup, que contém três RadioButtons, que são os três na parte inferior que vemos Botão Entre eles, android: drawableTop = ”@ drawable / profile” e
android: textColor = ”@ drawable / text” definem a chave de cor:
Interruptor de status da imagem
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_tabbar_home_selected" android:state_checked="true"/>
<item android:drawable="@mipmap/ic_tabbar_home_normal" android:state_checked="false"/>
</selector>
Troca de estado de texto
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#ffab00" android:state_checked="true"/>
<item android:color="#000" android:state_checked="false"/>
</selector>
Em seguida, precisamos fornecer três fragmentos para os três botões de opção.Nós precisamos apenas exibir algumas coisas simples para dizer a nós mesmos que a interface foi alterada.O código fonte não é publicado.
Então Atividade
public class MainActivity extends AppCompatActivity{
private FrameLayout frameLayout_nr;
private FragmentTabHost tabHost;
private RadioGroup radioGroup;
private Class fragments[];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initialize();
}
private void initialize(){
fragments = new Class[]{HomeFragment.class,MessageFragment.class,ProfileFragment.class};
frameLayout_nr = (FrameLayout)findViewById(R.id.frameLayout_nr);
tabHost = (FragmentTabHost) findViewById(R.id.tab);
radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
tabHost.setup(getApplicationContext(),getSupportFragmentManager(),R.id.frameLayout_nr); //tabHost关联上下文,FragmentManager和显示区域
for (int i = 0; i < fragments.length ; i++) { //向TabHost中添加fragment和标志位
TabHost.TabSpec tabSpec = tabHost.newTabSpec(String.valueOf(i)).setIndicator(String.valueOf(i));
tabHost.addTab(tabSpec,fragments[i],null);
}
tabHost.setCurrentTab(0);//设置初始选中项
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.rbHome:
tabHost.setCurrentTab(0);
break;
case R.id.rbMessage:
tabHost.setCurrentTab(1);
break;
case R.id.rbProfile:
tabHost.setCurrentTab(2);
break;
}
}
});
}
}
Agora execute seu código e você verá o efeito mostrado na figura no início. Experimente agora!
A jornada de mil milhas começa com um passo!