現在、いくつかのボタンを使用したアクティビティがあります。
私の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を与えたいのですが、それは可能ですか?
助けてくれてありがとう。
直接は不可能です。ただし、Android:tag
パラメータを取得します。
<ImageButton (...) Android:onClick="goToPage" Android:tag="25"/>
public void goToPage(View v) {
String pageNumber = v.getTag().toString();
/* ... */
}
Xmlでレイアウト要素を作成する場合は、そこで使用できます
<ImageButton
Android:id="@+id/some_id_value" />
どこ some_id_value
は、R.Javaで保持されるidに変換される一意の文字列の一種です(コードを変更することはできません)。
R.id.some_id_value
少し読んでください ある それは本当に基本です。
データバインディングを有効にし、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")}'/>
_
ビューにタグを設定できます。タグは基本的に、ビューに思い出を残す方法です。
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();
}
_