AndroidのTabActivityに対する見解は、個人的にはいいと思います

17570 ワード

http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html
answer1991
私の心の熱狂、未来への執着を止めることはできません.
Androidは汎用的なActivity Group(Androidマイクロブログクライアントのメインインタフェースのような効果)を実現しており、TabActivityを使用しないことを強くお勧めします
Activity Groupは実際の開発ではよく見られますが、私が使用したAndroidアプリケーションでは、10アプリケーションのうち9アプリケーションのメインインタフェースがActivity Groupを使用しています.Activity Groupといえば、国内では直接使用して開発されているようで、基本的にはTabActivityを使用しており、Activity Groupの唯一のサブクラスである.Android端末の新浪微博のメインインタフェースはTabActivityで実現され、他のアプリケーションもほとんどTabActivityで実現されています.私の目には、TabActivityはGoogleが提供した非常に失敗したAPIです(少なくとも私は今そう思っていますが、後でどこで失敗したのかを言います)が、中国のほとんどのアプリケーションがTabActivityを使用しているので、偶然なのかコピーしたのかを考えています.Activity Group(またはTabActivity)を使用して開発されたメインインタフェースの効果図は以下の通りです(著作権の問題に関連して、私はここで微博のメインインタフェースを接着しません.私は自分のものを接着します.見苦しいですが、新浪微博、微信などのAndroidクライアントを参考にすることに興味があります):
 
Android之对TabActivity的见解,个人觉得不错
 
 
Activity GroupはGoogleが提供する非常に優れたAPIと言えるが、少し複雑な書き換えをしなければ使いやすいので、この少し複雑な書き換えを実現する予定だ.TabActivityはActivity Groupの唯一のサブクラスとして期待を裏切った.
 
まず、Activity Groupの優れた点とその必要性について、Activityを画面のトップ要素(Context)として提示するのではなく、Activity Groupに埋め込む可能性を開発者に提供します.これはシーン(Context)を細分化した大きな飛躍であり、Activity Groupはメインシーンであり、ユーザーはナビゲーションボタンで所望のサブシーンを切り替えることができる.マイクロブログ機能を使用すると、最新の放送情報を見たり、自分でマイクロブログを送ったり、資料を修正したりするなどのサブシーンを持つかなり大きなシーンであり、ユーザーはボタンで希望するサブシーンに切り替えることができ、このサブシーンはメインシーンでもアクティブです.1つのメインシーンに複数の論理処理モジュールを持たせることができ、メインシーンはサブシーン論理を担当せず、メインシーンはシーンの論理を切り替えるだけを担当する.すなわち、各Activity(サブシーン)には1つの論理処理モジュールがあり、1つのActivity Groupには複数のActivityがあるが、Activityの論理には関与しない.これは論理コードを細分化し、モジュール化しているに違いない.Activity Groupとそれを内蔵するActivityが実現する機能は、1つのActivityで完全に完了することができます.Activity Groupとその所有するActivityの論理コードを1つのActivityに置くと、このActivityはどのくらいの行のコードを持っていて、メンテナンスに非常に不便をもたらすか考えてみてください.
 
さらにTabActivityの不足点としては、まず、TabActivity独自のビューはほとんど使われていない(つまり見苦しいラベルページボタン形式)、国内開発者が使っている特性はほとんどActivity Groupから受け継がれている.また、TabActivityの強制依存関係は、レイアウトファイルがTabHostをルートラベルにする必要があり、idが「@android:id/tabhost」である必要があり、TabWidgetラベルが必要であり、idが「@android:id/tabs」である必要があり、ActivityをロードするViewコンテナもあり、idは必ず@android:id/tabcontentである必要があります.強制依存関係だけで、私は気分が悪いと思います.TabActivityだけでなく、いくつかの特殊なActivityの中で、ListActivityにはこのような強制依存関係があり、ListActivityにはxxx(思い出せない)というListViewが必要であり、これらの弊害はGoogle開発者から重視されるべきだと思います.
 
では、私は次にActivity Groupを実現し、強制依存関係に別れを告げ、好きなようにビューを構築します.次のクラスは抽象クラスであり,開発者はこの抽象クラスを少し修正し,自分のビューを実現するだけでTabActivityに別れを告げることができる.
 
 
package com.chenjun.demo.abstracttabactivity;



import android.app.Activity;

import android.app.ActivityGroup;

import android.app.LocalActivityManager;

import android.content.Intent;

import android.os.Bundle;

import android.view.ViewGroup;

import android.widget.CompoundButton;

import android.widget.LinearLayout;

import android.widget.LinearLayout.LayoutParams;

import android.widget.RadioButton;



/**

 *          ActivityGroup。

 *                               Activity ActivityGroup。

 *                 :

 *     1.      Activity      ,getContainer()  。

 *     2.          ,initRadioBtns()  ,                initRadioBtn(int id)  。

 *     3.                ,onCheckedChanged(...)  。                    Activity     ,    setContainerView(...)  。

 * @author zet

 *

 */

public abstract class AbstractMyActivityGroup extends ActivityGroup implements

CompoundButton.OnCheckedChangeListener{

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initRadioBtns();

    }

    

    //  Activity View  ,     ViewGroup   

    private ViewGroup container;

    

    private LocalActivityManager localActivityManager;

    

    /**

     *   Activity View   id      ,          

     *                id,            View     

     * @return

     */

    abstract protected ViewGroup getContainer();

    

    /**

     *       ,      id     

     * @param id

     */

    protected void initRadioBtn(int id){

        RadioButton btn = (RadioButton) findViewById(id);

        btn.setOnCheckedChangeListener(this);

    }

    

    /**

     *            ,              

     */

    abstract protected void initRadioBtns();

    

    /**

     *    Activity   Intent  

     * @param cls

     * @return

     */

    private Intent initIntent(Class<?> cls){

        return new Intent(this,    cls).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    }

    

    /**

     *            ,  Activity    Activity  ,       Activity  

     * @param activityName    Activity localActivityManager    

     * @param activityClassTye       Activity   

     */

    protected void setContainerView(String activityName, Class<?> activityClassTye){

        if(null == localActivityManager){

            localActivityManager = getLocalActivityManager();

        }

        

        if(null == container){

            container = getContainer();

        }

        

        //         View

        container.removeAllViews();

        

        Activity contentActivity = localActivityManager.getActivity(activityName);

        if (null == contentActivity) {

            localActivityManager.startActivity(activityName, initIntent(activityClassTye));

        }

        

        //  Activity

        container.addView(

                localActivityManager.getActivity(activityName)

                        .getWindow().getDecorView(),

                new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,

                        LayoutParams.FILL_PARENT));

    }

    

}


 
 
 
書き換えが必要な方法と、なぜ書き換える必要があるのかは、元のコードに明記されています.次に、このクラスを具体的に実現し、私たちが望んでいる予想を達成します.
 
 
package com.chenjun.demo.abstracttabactivity;



import android.os.Bundle;

import android.view.ViewGroup;

import android.widget.CompoundButton;

import android.widget.RadioButton;



public class TestMyActivityGroup extends AbstractMyActivityGroup{

    //   Activity   ,LocalActivityManager              Activity 。

    private static final String CONTENT_ACTIVITY_NAME_0 = "contentActivity0";

    private static final String CONTENT_ACTIVITY_NAME_1 = "contentActivity1";

    private static final String CONTENT_ACTIVITY_NAME_2 = "contentActivity2";

    private static final String CONTENT_ACTIVITY_NAME_3 = "contentActivity3";

    private static final String CONTENT_ACTIVITY_NAME_4 = "contentActivity4";

    

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.my_activity_group);

        super.onCreate(savedInstanceState);

        

        ((RadioButton)findViewById(R.id.radio_button0)).setChecked(true);

    }

    

    /**

     *      id   Activity View

     */

    @Override

    protected ViewGroup getContainer() {

        return (ViewGroup) findViewById(R.id.container);

    }

    

    /**

     *      

     */

    @Override

    protected void initRadioBtns() {

        initRadioBtn(R.id.radio_button0);

        initRadioBtn(R.id.radio_button1);

        initRadioBtn(R.id.radio_button2);

        initRadioBtn(R.id.radio_button3);

        initRadioBtn(R.id.radio_button4);

    }

    

    /**

     *         ,       

     */

    @Override

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (isChecked) {

            switch (buttonView.getId()) {

            

            case R.id.radio_button0:

                setContainerView(CONTENT_ACTIVITY_NAME_0, ContentActivity0.class);

                break;

                

            case R.id.radio_button1:

                setContainerView(CONTENT_ACTIVITY_NAME_1, ContentActivity1.class);

                break;

                

            case R.id.radio_button2:

                setContainerView(CONTENT_ACTIVITY_NAME_2, ContentActivity2.class);

                break;

                

            case R.id.radio_button3:

                setContainerView(CONTENT_ACTIVITY_NAME_3, ContentActivity3.class);

                break;

                

            case R.id.radio_button4:

                setContainerView(CONTENT_ACTIVITY_NAME_4, ContentActivity4.class);

                break;

                

            default:

                break;

            }

        }

    }

    

}


 
 
レイアウトファイル:
 
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="0.0px"

  xmlns:android="http://schemas.android.com/apk/res/android">

  

    <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

    

        <LinearLayout android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_weight="1.0" />

        

        <RadioGroup android:gravity="center_vertical" android:layout_gravity="bottom" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">

            <RadioButton android:id="@+id/radio_button0" android:layout_marginTop="2.0dip" android:text="  1" style="@style/tab_radio" android:drawableTop="@android:drawable/ic_menu_call" />

            <RadioButton android:id="@+id/radio_button1" android:layout_marginTop="2.0dip" android:text="  2" style="@style/tab_radio" android:drawableTop="@android:drawable/ic_menu_camera" />

            <RadioButton android:id="@+id/radio_button2" android:layout_marginTop="2.0dip" android:text="  3" style="@style/tab_radio" android:drawableTop="@android:drawable/ic_menu_agenda" />

            <RadioButton android:id="@+id/radio_button3" android:layout_marginTop="2.0dip" android:text="  4" style="@style/tab_radio" android:drawableTop="@android:drawable/ic_menu_delete" />

            <RadioButton android:id="@+id/radio_button4" android:layout_marginTop="2.0dip" android:text="  5" style="@style/tab_radio" android:drawableTop="@android:drawable/ic_menu_help" />

        </RadioGroup>

        

    </LinearLayout>

    

</LinearLayout>


 
具体的な実現効果(ここでActivityはほとんど内容がないので、1行の字を加えた):
 
Android之对TabActivity的见解,个人觉得不错
 
具体的なコードプレゼンテーションはほとんどありませんが、ここではいくつかの説明をします.
  1.開発者は自分の実装クラスのonCreateメソッドで、まずビューを設定してからsuperを呼び出さなければならない.oncreate(...)方法.具体的になぜ抽象クラスのソースコードを見たのか、読者は理解できると信じています.
  2.ナビゲーションボタンについてRadioButtonを使用します.Androidは、このような場合に使用するのに適したボタンをわざわざカスタマイズしてくれませんでした.つまり、上に簡筆画を設定することができます.以下に説明があります.解决策:1)ImageButtonを使用して、简笔画と文字说明Pを1枚の画像の中に入れますが、これは非常に明らかな弊害があります.文字说明の文字フォントは固定されていて、Pが画像の中にあるので、システムの文字と同じではありません.ユーザーが派手なシステム文字を使用しているのに、ナビゲーションボタンが宋体で、上の内容の部分が彼のシステム文字である場合、次回も開発したアプリケーションを開くかどうかは想像できません.2)自分で1つのViewを実現して、RadioButtonの代わりに行って、学習の目的のためにこれは良いです.最善の解決策はやはりRadioButtonを使うと思います.少し修正すればいいです.具体的には新浪微博のリソースファイルを参照することができます.
 
欠陥反省:これらのコードはすべて私が再構築したもので、当時開発したときは開発プロセスを設計していませんでした(私はまずその実現クラスがあって、その抽象クラスがありました).自分で書いたActivity GroupはTabActivityと比較して利点が明らかで、欠点は不安定かもしれないが、Bugはしばらく発見されず、動的にロードされたActivityの論理コードが正しく実行されることである.