Android開発ActivityGroupdアプリケーションの下部ナビゲーションバー

Androidアプリケーションの下部ナビゲーションバーは非常に一般的であると言えます。たとえば、Sina Weibo、WeChatなどはすべてこのように設計されています。このアプリケーションの全員の最初の反応は、TabActivityを使用することです。今日は、代わりにActivityGroupを使用する方法を共有します。 TabActivity、およびそのような使用の利点。

ActivityGroupはGoogleが提供する非常に優れたAPIであり、TabActivityはActivityGroupの唯一のサブクラスです。

ActivityGroupの利点

まず、ActivityGroupの卓越性とその必要性について話しましょう。これは、開発者に可能性を提供します。この可能性は、Activityを画面の最上位要素(コンテキスト)として提示するのではなく、ActivityGroupに埋め込みます。これは大きな飛躍であり、シーン(コンテキスト)を細分割します。ActivityGroupはメインシーンであり、ユーザーはナビゲーションボタンを使用して目的のサブシーンを切り替えることができます。Weibo機能を使用する場合、最新の放送情報の視聴、独自のWeiboの投稿、データの変更などのサブシーンを持つかなり壮大なシーンです。ユーザーはボタンを押すことで目的のサブシーンに切り替えることができますが、このサブシーンはまだメインシーンでの活動。メインシーンに複数のロジック処理モジュールを持たせると、メインシーンはサブシーンロジックを担当しなくなり、メインシーンはシーンを切り替えるロジックのみを担当します。つまり、各アクティビティ(サブシーン)にはロジック処理モジュールがあり、ActivityGroupには複数のアクティビティがあります、しかし、間違いなくロジックコードを細分化およびモジュール化するアクティビティのロジックに干渉しません。ActivityGroupとそれが埋め込まれるActivityによって実装される機能は、1つのActivityで完了することができます。ActivityGroupとそれが所有するActivityのロジックコードをActivityに配置すると、このActivityはコードの行数は、メンテナンスにとって非常に不便です。

TabActivityの欠点

TabActivityの欠点について話しましょう。まず、TabActivityの独自のビュー(つまり、醜いタブボタンフォーム)はほとんど使用されておらず、開発者が使用するほとんどの機能はActivityGroupからほとんど継承されています。TabActivityの必須の依存関係もあります。そのレイアウトファイルは、TabHostをルートタグとして使用する必要があり、IDは「@android:id / tabhost」である必要があり、TabWidgetタグがあり、IDは「@android:id /」である必要がありますタブ」、およびアクティビティをロードするビューコンテナ、IDは@android:id / tabcontentである必要があります。依存関係を強制するだけでは、あまり快適ではありません。また、android3.0以降では、TabActivityではなくFragmentを使用することが推奨されています。3.0より前のバージョンとの互換性を保つために、Fragmentは開発者に普及していません。

フードライブラリの再構築後にActivityGroupによって実装されたメインページアーキテクチャを見てみましょう。

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));
	}

}

「メインシーン」MainActivityGroupには基本的にロジックコードはなく、各「サブシーン」を切り替えるためのロジックのみがあり、サブシーンの切り替えはActivityGroupManagerクラスによって管理されており、これもコード分離の役割を果たします。

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);
	}
}

ActivityGroupManagerクラスのshowContainer()メソッドはオンラインプラクティスとは異なります。

container.removeAllViews();
container.addView(view);

このアプローチはより単純なコードロジックを持っているように見えますが、これにより、「サブシーン」を切り替えるたびに、ロードされたビューが削除されます。一方では、パフォーマンスに欠け、もう一方は「サブシーン」の状態です。思い出せない。現在のアプローチは上記の問題を解決します。

さて、各「アクティビティ」のコードがあります。各「サブシナリオ」のロジックは独立しているため、ここにはコードはありません。

ここでもう1つ言及するのは、下部ナビゲーションバーの実装です。AndroidにはiOSのような事前定義されたコンポーネントがないため、レイアウトを自分で定義することしかできません。ここでは、RadioGroupを使用して、WeChatと同様の下部ナビゲーションバーの効果を実現しています。 、以下はレイアウトコードです。使用される他の場所に直接インクルードするだけです。

<?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>

おすすめ

転載: blog.csdn.net/xhf_123/article/details/49934489