Pode-se dizer que a barra de navegação inferior em aplicativos Android é muito comum. Por exemplo, Sina Weibo, WeChat, etc. são todos projetados desta forma. A primeira reação de todos neste aplicativo é usar TabActivity. Hoje irei compartilhar como usar ActivityGroup. TabActivity e as vantagens de tal uso.
ActivityGroup é uma API muito boa fornecida pelo Google e TabActivity é a única subclasse de ActivityGroup.
Vantagens do ActivityGroup
Em primeiro lugar, vamos falar sobre a excelência do ActivityGroup e sua necessidade, que oferece uma possibilidade para os desenvolvedores, pois essa possibilidade não apresenta a Activity como elemento superior da tela (Context), mas a embute no ActivityGroup. Este é um grande salto. Ele subdivide o contexto. ActivityGroup é uma cena principal, e os usuários podem alternar entre as subcenas desejadas por meio dos botões de navegação. Se você usar a função Weibo, é uma cena bastante grandiosa, com subcenas como assistir às últimas informações de transmissão, postar seu próprio Weibo e modificar informações. O usuário pode alternar para a subcena desejada pressionando o botão, e esta subcena permanece Atividades na cena principal. Deixe uma cena principal ter vários módulos de processamento lógico, a cena principal não é mais responsável pela lógica da subcena, a cena principal é apenas responsável pela lógica de troca de cenas, ou seja, cada atividade (subcena) possui um módulo de processamento lógico, e um ActivityGroup possui múltiplas atividades , Mas não interfere na lógica da Atividade, que sem dúvida subdivide e modulariza o código lógico. ActivityGroup e as funções a serem implementadas pela Activity que será embutida podem ser concluídas com apenas uma Activity, você pode imaginar, quando você coloca um ActivityGroup e o código lógico da Activity que ele possui em uma Activity, então esta Activity irá Quantas linhas de código você tem é muito inconveniente para manutenção.
Deficiências de TabActivity
Vamos falar sobre as deficiências do TabActivity. Em primeiro lugar, a visualização exclusiva do TabActivity dificilmente é usada (ou seja, a forma de botão de guia feia), e a maioria dos recursos usados pelos desenvolvedores são quase herdados do ActivityGroup. Também existe a dependência obrigatória de TabActivity. Seu arquivo de layout deve usar TabHost como a tag raiz e o id deve ser "@android: id / tabhost", deve haver uma tag TabWidget e seu id deve ser "@android: id / tabs ", e o container View que carrega a Activity, o id deve ser @android: id / tabcontent. Não me sinto muito confortável apenas para impor dependências. E depois do android3.0, sugeriu-se usar Fragment em vez de TabActivity. Só que para ser compatível com versões anteriores à 3.0, o Fragment não foi popularizado pelos desenvolvedores.
Vamos dar uma olhada na arquitetura da página principal implementada por ActivityGroup após a reconstrução da biblioteca de alimentos:
MainActivityGroup.java
public class MainActivityGroup extends ActivityGroup implements
OnCheckedChangeListener {
private static final String RECORD = "record";
private static final String CATEGORY = "category";
private static final String MORE = "more";
private ActivityGroupManager manager = null;
private FrameLayout container = null;
private RadioGroup radioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_main);
initView();
}
private void initView() {
radioGroup = (RadioGroup) findViewById(R.id.main_radio);
radioGroup.setOnCheckedChangeListener(this);
manager = new ActivityGroupManager();
container = (FrameLayout) findViewById(R.id.container);
manager.setContainer(container);
switchActivity(ActivityGroupManager.RECORD_ACTIVITY_VIEW, RECORD, RecordActivity.class);
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.record_button:
switchActivity(ActivityGroupManager.RECORD_ACTIVITY_VIEW, RECORD, RecordActivity.class);
break;
case R.id.category_button:
switchActivity(ActivityGroupManager.CATEGORY_ACTIVITY_VIEW, CATEGORY, CategoryActivity.class);
break;
case R.id.more_button:
switchActivity(ActivityGroupManager.MORE_AVTIVITY_VIEW, MORE, MoreActivity.class);
break;
default:
break;
}
}
private View getActivityView(String activityName, Class<?> activityClass) {
return getLocalActivityManager().startActivity(activityName,
new Intent(MainActivityGroup.this, activityClass))
.getDecorView();
}
private void switchActivity(int num, String activityName, Class<?> activityClass) {
manager.showContainer(num, getActivityView(activityName, activityClass));
}
}
Pode-se ver que basicamente não há código lógico no MainActivityGroup "cena principal", apenas a lógica para alternar cada "subcena", e a alternância da subcena é gerenciada por uma classe ActivityGroupManager, que novamente desempenha o papel de separação de código.
ActivityGroupManager.java
public class ActivityGroupManager {
private static final String TAG = "frag_manager";
public static final int RECORD_ACTIVITY_VIEW = 0;
public static final int CATEGORY_ACTIVITY_VIEW = 1;
public static final int MORE_AVTIVITY_VIEW = 2;
private HashMap<Integer, View> hashMap;
private ViewGroup container;
public ActivityGroupManager() {
hashMap = new HashMap<Integer, View>();
}
public void setContainer(ViewGroup container) {
this.container = container;
}
public void showContainer(int num, View view) {
if (!hashMap.containsKey(num)) {
hashMap.put(num, view);
container.addView(view);
}
for (Iterator<Integer> iter = hashMap.keySet().iterator(); iter.hasNext();) {
Object key = iter.next();
View v = hashMap.get(key);
v.setVisibility(View.INVISIBLE);
}
view.setVisibility(View.VISIBLE);
}
}
É importante mencionar que o método showContainer () na classe ActivityGroupManager não é como as práticas online:
container.removeAllViews();
container.addView(view);
Esta abordagem parece ter uma lógica de código mais simples, mas isso fará com que a visualização carregada seja removida toda vez que você alternar a "subcena". Por um lado, o desempenho está faltando e o outro é o estado da "subcena". Não consigo lembrar. A abordagem atual resolve os problemas acima.
Ok, então tem o código de cada "Activity". A lógica de cada "Subscenario" é independente, então não há código aqui.
Mais uma coisa a mencionar aqui é a implementação da barra de navegação inferior. Como o Android não tem um componente predefinido como o iOS, você só pode definir um layout. Aqui eu uso o RadioGroup para obter o efeito da barra de navegação inferior semelhante ao WeChat. , Abaixo está o código do layout, basta incluí-lo diretamente nos outros locais onde for utilizado.
<?xml version="1.0" encoding="utf-8"?>
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_radio"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_marginBottom="-20dp"
android:gravity="center"
android:orientation="horizontal"
android:padding="0dp" >
<RadioButton
android:id="@+id/record_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1.0"
android:background="@null"
android:button="@null"
android:checked="true"
android:drawableTop="@drawable/main_tab_record_selector"
android:gravity="center"
android:tag="record" />
<RadioButton
android:id="@+id/category_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@null"
android:button="@null"
android:drawableTop="@drawable/main_tab_category_selector"
android:gravity="center_horizontal"
android:tag="category" />
<RadioButton
android:id="@+id/more_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@null"
android:button="@null"
android:drawableTop="@drawable/main_tab_more_selector"
android:gravity="center_horizontal"
android:tag="more" />
</RadioGroup>