10

すべての画面で同じ項目 [タブとして機能する 5 つのボタン] を必要とするアプリケーションがあります。これらの 5 つのボタンを持つ「ベース XML レイアウト」を作成し、他のすべての XML ファイルを何らかの方法でベース レイアウトから拡張して、最終的に同じ機能を持つ複数のボタンを用意する必要がないようにすることは可能ですか? .

API 9 でサポートできる、この問題に対するより良いアプローチはありますか

4

3 に答える 3

16

ベース アクティビティの共通レイアウトを作成します。<include>次に、同じにしたいタグを使用して、そのレイアウトをすべてのレイアウトに含めます。

その後、1 つの抽象アクティビティを作成し、このアクティビティでボタンとコードのすべてのクリックを処理してから、ベース レイアウトを含めた他のすべてのアクティビティでこのアクティビティを拡張します。

例えば

共通ボタン xml レイアウト

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/tabhost_bg"
    android:gravity="center"
    android:orientation="horizontal" 
    android:weightSum="3">

    <Button
        android:id="@+id/btnHome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bottom_btn_active" 
        android:layout_weight="1"
        android:text="@string/label_home"
        style="@style/bottom_tab_btn"/>

    <Button
        android:id="@+id/btnSetting"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bottom_btn_active" 
        android:layout_weight="1"
        android:text="@string/label_settings"
        style="@style/bottom_tab_btn"/>

    <Button
        android:id="@+id/btnMore"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bottom_btn_active" 
        android:layout_weight="1"
        android:text="@string/label_more"
        style="@style/bottom_tab_btn"/>

</LinearLayout>

上記の XML ファイルを含めることができる xml レイアウトを次に示します。

<include
        android:id="@+id/bottombar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        layout="@layout/bottom_bar" />

ここで android:layout_width と android:layout_height と layout は必須の属性です

次に、共通コントロールのクリックを処理するベース アクティビティを示します。

public abstract class BottomBar extends Activity implements OnClickListener {

    protected Button btnHome;
    Button btnSetting, btnMore;
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
    }

    protected void mappingWidgets() {

        btnHome = (Button) findViewById(R.id.btnHome);
        btnSetting = (Button) findViewById(R.id.btnSetting);
        btnMore = (Button) findViewById(R.id.btnMore);

        btnHome.setOnClickListener(this);
        btnSetting.setOnClickListener(this);
        btnMore.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v == null)
            throw new NullPointerException(
                    "You are refering null object. "
                            + "Please check weather you had called super class method mappingWidgets() or not");
        if (v == btnHome) {

        } else if (v == btnSetting) {

        }else if(v == btnMore) {

        }
    }

    protected void handleBackgrounds(View v) {
        if (v == btnHome) {
            btnHome.setBackgroundResource(R.drawable.bottom_btn_hover);
            btnSetting.setBackgroundResource(R.drawable.bottom_btn_active);
            btnMore.setBackgroundResource(R.drawable.bottom_btn_active);

        } else if (v == btnSetting) {
            btnHome.setBackgroundResource(R.drawable.bottom_btn_active);
            btnSetting.setBackgroundResource(R.drawable.bottom_btn_hover);
            btnMore.setBackgroundResource(R.drawable.bottom_btn_active);

        } else if (v == btnMore) {
            btnHome.setBackgroundResource(R.drawable.bottom_btn_active);
            btnSetting.setBackgroundResource(R.drawable.bottom_btn_active);
            btnMore.setBackgroundResource(R.drawable.bottom_btn_hover);
        }
    }

}

残りの 1 つのステップは、この Base アクティビティをすべてのアクティビティに拡張することです。

extendsキーワードを使用して、アクティビティの Base アクティビティを拡張できます。例えば

public class MyActivity extends BottomBar

注:子アクティビティから、基本クラスのスーパー メソッドを呼び出して、基本レイアウトの共通コントロールのクリックを処理する必要があります。

したがって、単一のアクティビティ内に複数の共通レイアウトを実装できます。

これがあなたを助けることを願っています。楽しみ!!

于 2012-10-21T04:37:30.113 に答える
3

タグを調べてみるといいかもしれません<include> 作成した xml を効果的に取得し、それをコピーして他のレイアウトに貼り付けます。

したがって、ボタンを使用して単一のレイアウトを作成することになります。それらを<merge>タグの間に入れて、配置される場所を作成しないようにFrameLayoutします。次に、<include>タグを使用して、他のレイアウトで同じレイアウトを使用します。

注:タグを使用する場合は、常に属性layout_widthと属性をオーバーライドしてください。layout_height<include>これは、同じ値のときにそれらをオーバーライドしている場合でも当てはまります。以前のバージョンの Android にはバグがあり、それらの属性もオーバーライドしないと、特定の属性が無視されてしまいます。

于 2012-10-21T04:30:50.083 に答える
1

インクルードは行くべき道ですが、私はこれを自分で確実に機能させることはできませんでした。多分私は何か間違ったことをしているかもしれませんが、コンパイラはマージされたレイアウトで常に ID を取得するとは限りません。

于 2012-10-21T05:38:12.210 に答える