カスタムダイアログとレイアウト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="fill_parent">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Tap Me"
Android:onClick="dialogClicked" />
</LinearLayout>
ダイアログクラスで、メソッド「dialogClicked(Viewv)」を実装しました。
public class TestDialog extends Dialog {
public TestDialog(final Context context)
{
super(context);
}
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
}
public void dialogClicked(final View view)
{
System.out.println("clicked");
}
}
ボタンをタップすると、NoSuchMethodException'dialogClicked 'が表示されます。レイアウトxmlでonClickハンドラーを設定すると、アクティビティでは正常に機能しますが、ダイアログでは機能しません。何か案は?私が間違っているのは何ですか?
Activityでメソッド(dialogClicked)を定義します。そして、次のコードのようにTestDialogを変更します。
public class TestDialog extends Dialog {
Context mContext;
public TestDialog(final Context context)
{
super(context);
mContext=context;
}
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout ll=(LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.dialog, null);
setContentView(ll);
}
}
私はそれがうまくいくと思います:)
問題は範囲の1つだと思います。 xmlでこれにどのように対処したかはわかりませんが、基本的に、レイアウトxmlのdialogClickedメソッドは、ダイアログクラスで定義したメソッドの場所を認識していません。
カスタムレイアウトでボタンをバインドするために私が見た標準的なアプローチは次のとおりです。
。
public class TestDialog extends Dialog implements Android.view.View.OnClickListener
{
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
((Button)findViewById(R.id.dialog_btn_mybutton)).setOnClickListener(this);
}
public void onClick(View view)
{
switch (view.getId())
{
case R.id.dialog_btn_mybutton:
//do stuff
// dismiss();
// cancel etc.
break;
}
}
}
お役に立てば幸いです。それでも、xmlonClickを使用してメソッドにバインドするための解決策があるかどうかを知りたいと思います。おそらく、setContentViewの追加の引数ですか?何か他のもの。
View.Javaソースで次のコードを見つけました。
public void onClick(View v) {
if (mHandler == null) {
try {
mHandler = getContext().getClass().getMethod(handlerName,
View.class);
...
->ビューは、そのコンテキストを使用してonclickハンドラーメソッドを解決します。
Dialog.Javaソースから次のコードを確認してください。
public Dialog(Context context, int theme) {
mContext = new ContextThemeWrapper(context, theme == 0 ? com.Android.internal.R.style.Theme_Dialog : theme);
...
ダイアログのコンストラクターで、ContextThemeWrapperのインスタンスが作成され、コンテキストとして設定されます。このインスタンスは、カスタムダイアログクラスでも、ハンドラメソッドを実装する場所となる呼び出しアクティビティでもありません。したがって、ビューはonclickハンドラーメソッドを見つけることができません。
ただし、onclickXML属性を使用する必要があります。利用可能な回避策はありますか?
Android:onClick="method"
はかなりかっこいいですが、Android 1.5では機能しないので、しばらくは避けています。
簡単な回避策:
Dialog
をActivity
にし、Android:theme="@Android:style/Theme.Dialog"
をAndroidManifest
で使用します。
ダイアログには署名が必要です
dialogClicked(DialogInterface dialog, int id) { ... }
Jett Hsiehの投稿に続いて、showDialogとdismissDialogを使用してダイアログを少し異なる方法で実装しましたが、Android:onClickを機能させるための基本は同じです。今後の参考のために、サンプルコードを以下に示します。
public class ExampleActivity extends Activity {
static final int DIALOG_DISCLAIMER = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showDialog(DIALOG_DISCLAIMER);
}
protected Dialog onCreateDialog(int id)
{
Dialog dialog;
switch(id)
{
case DIALOG_DISCLAIMER:
dialog = new Dialog(this);
dialog.setContentView(R.layout.main_disclaimer);
LinearLayout ll = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.main_disclaimer, null);
dialog.setContentView(ll);
break;
default:
dialog = null;
}
return dialog;
}
public void onClick(View v)
{
switch(v.getId())
{
case R.id.maindisclaimer_button_accept:
dismissDialog(DIALOG_DISCLAIMER);
break;
}
}
}
そしてレイアウトファイル:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/linearLayout1"
Android:padding="10dp"
Android:orientation="vertical"
Android:background="@drawable/roundedcorners">
<Button
Android:id="@+id/maindisclaimer_button_accept"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:text="@string/string_accept"
Android:onClick="onClick" >
</Button>
</LinearLayout>
システムは、レイアウトが拡張された場所、またはxmlがコンテンツとして設定されたアクティビティクラスでメソッドを検索します。
ダイアログではなく、アクティビティでそのメソッド(dialogClicked)を定義してみてください。
リフレクションを使用する可能性があるため、異なるアクティビティを使用する場合は、そのダイアログを表示する可能性のある各アクティビティにそのメソッドを記述してください
ダイアログは常に作成され、アクティビティの一部として表示されます。 Android参照:
OnCreateDialog()メソッドの外部でダイアログを作成することにした場合、 ダイアログはアクティビティに添付されません。ただし、setOwnerActivity(Activity)を使用して アクティビティにアタッチすることはできます。
また、getApplicationContext()によって返されたオブジェクトを渡しますか? TestDialogのコンストラクターに?