2010-11-22 5 views
16

AndroidのダイアログでないNoSuchMethodExceptionが発生します。私はメソッド「dialogClicked(ビューV)」を実施してきたダイアログクラスでレイアウトXMLにonClick属性を使用すると、私はカスタムダイアログやレイアウト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> 

を:

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ハンドラを設定すると、アクティビティではうまく動作しますが、ダイアログではうまく動作しません。何か案は?私は間違っているの? >ビューのonclickハンドラメソッドを解決するために、そのコンテキストを使用しています -

public void onClick(View v) { 
          if (mHandler == null) { 
           try { 
            mHandler = getContext().getClass().getMethod(handlerName, 
              View.class); 
    ... 

は:

+1

dialogClicked(最終ビュービュー)からdialogClicked(ビュービュー)に "final"修飾子を削除しようとしましたか? – 100rabh

+0

http://stackoverflow.com/questions/12582695/android-dialog-nosuchmethodexception-error-when-using-xml-onclick/26263507#26263507 –

答えて

25

アクティビティでメソッド(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); 
} 
} 

は、私はそれが動作します:) Jettの謝の記事に続き

+0

はい、それは主なポイントです:onClickを使用する場合は、アクティビティでメソッド(dialogClicked)を定義します。 –

+0

Thx ...少なくともアクティビティでイベントをキャッチし、ハンドラメソッドをダイアログ実装に移動するためのさらなる最適化のエントリがあります。 – Impression

+0

@Jett Hsieh okでも、どのようにボタンキャンセルとボタン選択のコードを書いて、このテクニックでエラーが出るようなダイアログを消すことができますか? – Erum

1

ダイアログは私がView.javaソースに次のコードを見つけた

dialogClicked(DialogInterface dialog, int id) { ... } 
+0

答えがうまくいかないより具体的な例を教えてください。方法は、私が理解して:)私は呼び出し側のアクティビティとダイアログでこのメソッドを使用しようとしました。しかし、まだNoSuchMethodExcepionのdialogClicked(View)を取得してください。 – Impression

+0

通常のonClickイベントをOnClickListenerでキャッチしたくない場合は、android:onClick機能を使用します。 – Impression

2

署名が必要です。

Noew Dialog.javaソースから次のコードダイアログのコンストラクタで

public Dialog(Context context, int theme) { 
    mContext = new ContextThemeWrapper(context, theme == 0 ? com.android.internal.R.style.Theme_Dialog : theme); 
    ... 

ContextThemeWrapperのインスタンスはコンテキストとして作成され、設定されます。このインスタンスは、カスタムダイアログクラスでも呼び出し側アクティビティでもなく、ハンドラメソッドを実装する場所でもあります。したがって、ビューはonclickハンドラメソッドを見つけることができません。

しかし、私はonclick XML属性を使用する必要があります。利用可能な回避策はありますか?

+0

これは答えではないので、私はむしろあなたの質問に対するさらなる調査としてこれを動かしたいと思います。 –

0

ダイアログではなくアクティビティでそのメソッド(dialogClicked)を定義してみます。あなたは様々なアクティビティを使用している場合だけでダイアログが作成され、活動の一部として表示常にあるダイアログ

+0

私はstackoverflowで私の質問をする前に既に試してみました - うまくいきません。彼の現時点では、デフォルトのビュー実装の反射メカニズムのために、この問題を修正することはできません。 – Impression

0

ことを示しているかもしれませんそれぞれの活動でその方法を記述して

これは、リフレクションを使用する場合があります。 Androidによると、参考文献:

If you decide to create a dialog outside of the onCreateDialog() method, 
it will not be attached to an Activity. You can, however, 
attach it to an Activity with setOwnerActivity(Activity).

さらに、getApplicationContext()によって返されたオブジェクトを渡していますか? TestDialogのコンストラクタに?

+0

動作しません(テスト済み)。コードによれば、私は答えに投稿しました。あなたは、Androidのダイアログコンストラクタの実装がコンテキスト(ContextThemeWrapper)の独自のプライベートインスタンスを作成することがわかります。ハンドラメソッドを決定するためにonclickイベントによって使用されるリフレクションコールは、これらの内部作成コンテキストに対して行われます。 – Impression

6

問題は範囲の1つだと思います。私はxmlでこれをどのように扱いましたか分かりませんが、本質的にレイアウトxmlのdialogueClickedメソッドは、ダイアログクラスで定義したメソッドの場所を知りません。

カスタムレイアウトのボタンをバインドするのに標準的なアプローチは次のとおりです。

  1. バインドに
  2. ボタンをOnClickListenerクラスを実装するIDに基づいてのonClickボタンのボタンアウトダイアログクラス
  3. スイッチにイベントをクリックします。ボタンにIDを追加する必要があります。

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; 
    } 
} 

}

お役に立てば幸いです。メソッドにバインドするためにxml onClickを使用する解決策があるかどうかを知ることには依然として興味があります。おそらくsetContentViewの追加引数ですか?何かr'other。

1

android:onClick="method"はかなりクールですが、Android 1.5では動作しませんので、しばらくは避けています。

簡単な回避策:

あなたDialogActivityを作成し、あなたAndroidManifestandroid:theme="@android:style/Theme.Dialog"を使用しています。

1

が、私は少し異なるに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> 
0

システムは、レイアウトから、またはXMLがコンテンツとして設定されたにアクティビティクラスに膨張した場所にメソッドを探します。

関連する問題