web-dev-qa-db-ja.com

ボタンxmlにパラメーターを追加する可能性はありますか?

現在、いくつかのボタンを使用したアクティビティがあります。

私のxmlでは、ボタンは次のように定義されています。

    <ImageButton (...) Android:onClick="GoToPageX"/>

そして私は私の活動にあります:

public void GotoPageX() {
    startActivity(new Intent(this, PageX.class));
    finish();

}

問題は、何百ものボタンがあり、書きたくないことです。

<ImageButton (...) Android:onClick="GoToPage1"/>
<ImageButton (...) Android:onClick="GoToPage2"/>
<ImageButton (...) Android:onClick="GoToPage3"/>
...
<ImageButton (...) Android:onClick="GoToPage100"/>

およびすべてのスクリプト。

私は今使っています

public void GotoPage( int i) {
    startActivity(new Intent(getBaseContext(), activities.get(i)));
    finish();
}

そして、xmlからパラメータiを与えたいのですが、それは可能ですか?

助けてくれてありがとう。

39
Waza_Be

直接は不可能です。ただし、Android:tagパラメータを取得します。

<ImageButton (...) Android:onClick="goToPage" Android:tag="25"/>

public void goToPage(View v) {
    String pageNumber = v.getTag().toString(); 
    /* ... */
}
95
OcuS

Xmlでレイアウト要素を作成する場合は、そこで使用できます

<ImageButton
    Android:id="@+id/some_id_value" />

どこ some_id_valueは、R.Javaで保持されるidに変換される一意の文字列の一種です(コードを変更することはできません)。

R.id.some_id_value

少し読んでください ある それは本当に基本です。

2
Robert

データバインディングを有効にし、onClick値にラムダ式を使用することでこれを行うこともできます。この方法は、異なるタイプの複数の入力を使用する予定がある場合に特に役立ちます。この戦略が使用される単純なMainActivity.xmlの例を次に示します。

_<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="main" type="com.example.Android.myapp.MainActivity" />
    </data>
    <LinearLayout Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(1,"one")}'/>
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(2,"two")}'/>
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(3,"three")}'/>
        ...
        <ImageButton (...) Android:onClick='@{() -> main.GotoPage(100,"one hundred")}'/>
    </LinearLayout>
</layout>
_

およびMainActivity.Java

_public void GotoPage(int i, String otherVariable) {
    /** code using i and otherVariable **/
}
_

PDATE:データバインディングの設定方法がわからない場合は、ここで説明するので、Googleで探し回る必要はありません。まず、build.gradleファイルでdataBindingを有効にします。

_Android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}
_

また、jcenter()がリポジトリにあることを確認してください。

次に、onClickが使用されるレイアウトのXMLに移動し、そのレイアウトをlayoutタグで次のようなdataセクションでラップします。

_<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="main" type="com.example.Android.yourapp.MainActivity" />
    </data>
    <YourLayout>
        ...
    </YourLayout>
</layout>
_

variableタグのtypeパラメーターには、onClickが指す関数を含むクラスを配置する必要があります。この例では、テストプロジェクトでMainActivityという名前のメインアクティビティクラスを使用します。

上記の例のようにレイアウトをlayoutタグでラップした後、Android Studioでプロジェクトをクリーンアップします。キャッシュ/再起動を無効にするか、閉じて再度開く必要がありますAndroid Studio。

次に、データバインディングを設定しようとしているonClickのレイアウトが、メインアクティビティクラスでsetContentViewによって設定されているレイアウトと同じ場合、メインアクティビティクラスを含むファイルを開きます。データバインディングを設定しようとしているonClickを含むレイアウトが別のファイルでプログラムによって拡張されている場合は、代わりにレイアウトが拡張されているファイルを開きます。

これらのインポートをそのファイルに追加します。

_import com.example.Android.yourapp.databinding.YourLayoutBinding;
import Android.databinding.DataBindingUtil;
_

インポートする最初のクラスは、プロジェクトをクリーンアップするときに生成され(場合によってはキャッシュ/再起動を無効にする必要があります)、layoutラッパーを追加したXMLファイルに基づいて自動的に名前が付けられます。レイアウトファイルの名前がyour_layout.xmlの場合、インポートクラスの名前はYourLayoutBindingになります。正確なインポートパスはアプリの名前と構造に依存しますが、常にdatabinding親クラス内にあります。

次のステップは、データバインディングを追加するレイアウトがsetContentViewで設定されているか、inflateで拡張されているかによって異なります。次のステップの両方のバージョンは、メソッドsetMainを使用します。 setMainメソッドは自動的に生成され、追加したnameラッパーのlayoutパラメーターの値を使用して名前が付けられます。 _name="main"_を入れたため、メソッドはsetMainと呼ばれます。


データバインディングを追加するレイアウトがsetContentViewで設定されたレイアウトと同じ場合メインアクティビティクラスでsetContentView(R.layout.your_layout);のように見える行を見つけて変更しますsetContentViewの代わりに_DataBindingUtil.setContentView_を使用し、最初の引数としてthisを追加します。 _binding.setMain_を使用して、レイアウトのmain変数が現在のアクティビティを指すようにします。

_YourLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.your_layout);
binding.setMain(this);
_

データバインディングを追加するレイアウトがsetContentViewで設定されているのではなく、拡張されている場合コード内で拡張されている場所に移動します。次のようになります。

_return inflater.inflate(R.layout.your_layout, container, false);
_

_DataBindingUtil.inflate_を使用するように変更し、前のインフレータを最初の引数として追加します。 _binding.setMain_を使用してレイアウトのmain変数をメインアクティビティにポイントし、binding.getRoot()を使用してビューを取得します。次のようになります。

_YourLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false);
binding.setMain((MainActivity) getActivity());
return binding.getRoot();
_

これで、データバインディングを使用する準備が整いました。メインアクティビティクラス内を指すonClickの関数を追加します。

_public void exampleFunction(int number, String text) {
    System.out.println("Number: " + number + ", Text: " + text);
}
_

ラムダ式を使用して、データバインディングを追加したレイアウトから呼び出すことができます。このサンプル関数はViewを必要としないため、次のように使用できます。

_<Button Android:id="@+id/buttonID"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:textSize="26sp"
    Android:text="Test"
    Android:onClick='@{() -> main.exampleFunction(123, "test")}'/>
_

onClick入力を使用する場合は、Stringの値を単一引用符で囲んでください。

ボタンのビューを関数に渡す必要がある場合は、関数の必須引数にViewパラメーターを追加し、代わりに次のようなラムダ式を使用します。

_<Button Android:id="@+id/buttonID"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:textSize="26sp"
    Android:text="Test"
    Android:onClick='@{(view) -> main.exampleFunction(view, 123, "test")}'/>
_
2
omikes

ビューにタグを設定できます。タグは基本的に、ビューに思い出を残す方法です。

xml:

_<ImageButton
    ...Other Parameters...
    Android:id="@+id/Button2"
    Android:tag="2"
    Android:onClick="GoToPageX"/>
<ImageButton
    ...Other Parameters...
    Android:id="@+id/Button3"
    Android:tag="3"
    Android:onClick="GoToPageX"/>
_

行_Android:tag="2"_は、_2_(stringデータ型)のタグ値を_Button2_に設定します

Javaファイル:

一般的なケース:
_GoToPageX(View v)関数内で、v.getTag()を使用して、対応するビューのタグ値を取得します(メソッドが呼び出されたビューから)。

あなたの場合:
次のようにメソッドを追加します

_public void GoToPageX(View v){
    int i = Integer.parseInt(v.getTag()); //parseInt converts string to integer
    startActivity(new Intent(getBaseContext(), activities.get(i)));
    finish();
}
_
1