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>