web-dev-qa-db-ja.com

含まれているレイアウトのボタンOnclickリスナー

私は膝を曲げてあなたのところに来ます、手に質問します。私はAndroidに比較的慣れていないので、私が言うかもしれない冒とく的なことは許してください。

Intro:アプリにはいくつかのレイアウトがあり、すべてに共通のフッターを含める必要があります。このフッターには、ホームページに戻る、ログアウトするなどのいくつかの重要なボタンがあります。

IncludeタグとMergeタグを使用して、必要なすべてのページにこのフッターを表示させることができました。問題は、すべてのボタンのクリックリスナーを定義することです。フッターレイアウトを含む画面に関連付けられたすべてのアクティビティでリスナーを定義できますが、画面の数が増えると、これは非常に面倒になります。

私の質問はこれです:Android:onClickを使用して任意の画面からアクセスできる、アプリケーション全体で機能するボタンクリックリスナーを定義できますか? ボタンの属性?

つまり、ボタンクリックリスナーをFooterClickListenersのように別のクラスで1回定義し、そのクラスにリスナーとして名前を付けますフッターのボタンクリックのクラス。アイデアは、リスナーコードへの単一のアクセスポイントを作成することです。これにより、前述のリスナーに対するすべての変更がアプリケーション全体に反映されます。

22
Sreedevi J

いくつかのレイアウトで使用したメニューにも同じ問題がありました。この問題を解決するには、RelativeLayoutを拡張するクラスでレイアウトXMLファイルをインフレートし、onClickListenerを定義しました。その後、メニューを必要とする各レイアウトにクラスを含めました。コードは次のようになります。

menu.xml

<?xml version="1.0" encoding="utf-8"?>

<merge xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <ImageButton Android:id="@+id/map_view"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentLeft="true"
        Android:src="@drawable/button_menu_map_view"
        Android:background="@null"
        Android:scaleType="fitCenter"
        Android:layout_height="@dimen/icon_size"
        Android:layout_width="@dimen/icon_size">
    </ImageButton>

    <ImageButton Android:id="@+id/live_view"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentLeft="true"
        Android:src="@drawable/button_menu_live_view"
        Android:background="@null"
        Android:scaleType="fitCenter"
        Android:layout_height="@dimen/icon_size"
        Android:layout_width="@dimen/icon_size">
    </ImageButton>

    <ImageButton Android:id="@+id/screenshot"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentRight="true"
        Android:src="@drawable/button_menu_screenshot"
        Android:background="@null"
        Android:scaleType="fitCenter"
        Android:layout_height="@dimen/icon_size"
        Android:layout_width="@dimen/icon_size">
    </ImageButton>

</merge>

MenuView.Java

public class MenuView extends RelativeLayout {

    private LayoutInflater inflater;

    public MenuView(Context context, AttributeSet attrs) {
        super(context, attrs);

        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.menu, this, true);

        ((ImageButton)this.findViewById(R.id.screenshot)).setOnClickListener(screenshotOnClickListener);        
        ((ImageButton)this.findViewById(R.id.live_view)).setOnClickListener(liveViewOnClickListener);       
        ((ImageButton)this.findViewById(R.id.map_view)).setOnClickListener(mapViewOnClickListener);
    }

    private OnClickListener screenshotOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), ScreenshotActivity.class));
        }
    };  

    private OnClickListener liveViewOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), LiveViewActivity.class));
        }
    };

    private OnClickListener mapViewOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), MapViewActivity.class));
        }
    };  
}

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/main"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <SurfaceView Android:id="@+id/surface"
        Android:layout_width="fill_parent"
        Android:layout_weight="1"
        Android:layout_height="fill_parent">

    </SurfaceView>

    <!-- some more tags... -->

    <com.example.inflating.MenuView
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent" />

</RelativeLayout>

とともに <com.example.inflating.MenuView />タグを使用すると、自己作成のレイアウト(onClickListenerを含む)を他のレイアウトで再利用できます。

18

これは近い将来、roboguiceに追加されるものです。タイトルバーやフッターなどのコントローラークラスを構築し、イベントを自動配線することができます。

チェックアウト http://code.google.com/r/adamtybor-roboguice/ 最初のスパイク。

基本的に、roboguiceを使用している場合は、フッターのコンポーネントを定義し、そのフッターコンポーネントを各アクティビティに挿入するだけです。

残念ながら、インクルードレイアウトの場合と同様に、すべてのアクティビティにコントローラーを追加する必要がありますが、良い点はすべてが配線され、すべてのロジックが単一のクラスに留まることです。

以下は、いくつかの使用例の疑似コードです。

public class FooterController {
  @InjectView(R.id.footer_button) Button button;

  @Inject Activity context;

  @ContextObserver
  public void onViewsInjected() {
    button.setOnClickListener(new OnClickListener() {
       void onClick() {
         Toast.makeToast(context, "My button was clicked", Toast.DURATION_SHORT).show();
        }
    });
  }
}

public class MyActivity1 extends RoboActivity {
  @Inject FooterController footer;
}

public class MyActivity2 extends RoboActivity {
  @Inject FooterController footer;
}
3
abombss

あなたが説明するような解決策は不可能です、申し訳ありません。ただし、フッターを使用するすべてのアクティビティに共通の親アクティビティを設定できます。アクティビティでは、フッターボタンのハンドラーメソッドを提供し、フッターアクションを処理する必要があるたびに、そのハンドラーメソッドから継承します。

0