22

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

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

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

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

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

4

3 に答える 3

18

いくつかのレイアウトで使用したメニューでも同じ問題が発生しました。私は、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を含む)を他のレイアウトで再利用できるようになります。

于 2011-01-08T23:05:51.190 に答える
3

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

最初の急上昇については、http://code.google.com/r/adamtybor-roboguice/をチェックアウトしてください。

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

残念ながら、インクルードレイアウトで行ったように、すべてのアクティビティにコントローラーを追加する必要がありますが、良いニュースは、すべてが接続され、すべてのロジックが1つのクラスにとどまるということです。

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

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;
}
于 2010-12-27T21:55:21.453 に答える
0

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

于 2010-11-08T07:35:03.207 に答える