Barra de navegação inferior do aplicativo ActivityGroupd de desenvolvimento Android

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>

Acho que você gosta

Origin blog.csdn.net/xhf_123/article/details/49934489
Recomendado
Clasificación