3

私はJavaとAndroidを初めて使用し、最初のテストアプリに取り組んでいます。

進行しましたが、ダイアログでブロックされています。

アクティビティのダイアログを次のように表示します。

//BuyActivity.java
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shop);

    initialize_PR();
    display_PR();
    BuyDialog=new Dialog(this);
    BuyDialog.setContentView(R.layout.dialog_buy);

}
public void Action_ShowDialog_Buy(View view) {
    BuyDialog.show() ;
}

また、Action_ShowDialog_Buyをトリガーするアクティビティのボタンをクリックすると、ダイアログが正しく表示されます。しかしその後、ダイアログ自体にボタンがあります。

<!-- dialog_buy.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<!-- Other stuff -->

<Button
    android:id="@+id/Button_Buy"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/Some_Other_Stuff"
    android:layout_centerHorizontal="true"
    android:text="@string/button_buy"
    android:onClick="Action_ShowDialog_Buy" />

</RelativeLayout>

ボタンメソッドAction_ShowDialog_Buyは、アクティビティに実装されています。

public void Action_ShowDialog_Buy(View view) {
    BuyDialog.dismiss() ;
}

しかし、ダイアログのボタンをクリックすると、次のエラーが表示されます。

java.lang.IllegalStateException: Could not find a method BuyActivity.Action_ShowDialog_Buy(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'Button_Buy'

以下:

Caused by: java.lang.NoSuchMethodException:BuyActivity.Action_ShowDialog_Buy

ただし、上記のように、メソッドはアクティビティに存在します。

これはある種のスコープの問題だと思いますが、なんとか理解できません。レイアウトxmlでonClick属性を使用すると、AndroidダイアログでNoSuchMethodExceptionが発生することを読みましたが、コードをコピーするだけでなく、理解する必要があることに注意してください。

どうもありがとう

4

5 に答える 5

2

メソッド「Action_ShowDialog_Buy」を呼び出そうとしていますが、このメソッドはDialogオブジェクトに存在しません。xmlで指定する場合、このメソッドはアクティビティに含まれないようにする必要があります。アクティビティでクリックを処理する場合は、プログラムでonClickListenerを設定する必要があります。

Button b=(Button)BuyDialog.findViewById(R.id.Button_Buy);
b.setOnClickListener(new OnClickListener(){
    @Override
    onClick(View v){
      BuyDialog.dismiss();
    }

});
于 2012-09-25T12:15:21.603 に答える
1

以下:

Caused by: java.lang.NoSuchMethodException:BuyActivity.ActionShowDialog_Buy

これをロックすると、メソッドの名前のActionShowDialog_Buy記号を忘れてしまいます_

于 2012-09-25T12:18:49.603 に答える
1

xmlファイルでsetclickabletrueを使用する必要があります。

<!-- dialog_buy.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <!-- Other stuff -->

        <Button
            android:id="@+id/Button_Buy"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/Some_Other_Stuff"
            android:layout_centerHorizontal="true"
            android:text="@string/button_buy"
            android:onClick="Action_ShowDialog_Buy"
            android:clickable="true" />

        </RelativeLayout>
于 2013-03-07T08:51:57.607 に答える
0

助けてくれたみんなに感謝します。

Dialogから派生したクラスを作成し、次のコードを使用してこれを整理することができました。

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.RelativeLayout;

public class BuyDialogClass extends Dialog
{

//Ensure this Dialog has a Context we can use
Context mContext ;

public BuyDialogClass(Context context) {
    super(context);
    mContext=context; //Store the Context as provided from caller
}

@Override
 protected void onCreate(final Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  RelativeLayout ll=(RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.dialog_buy, null);
  setContentView(ll); 
 }

}

これにより、ダイアログを次のように呼び出すことができました。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shop);

    initialize_PR();
    display_PR();
    BuyDialog=new BuyDialogClass(this);
    //The setContentView is not necessary here as we call it on the onCreate

    //We can NOT access Dialog widgets from here,
    //because the dialog has not yet been shown.

}
public void Action_ShowDialog_Buy(View view) {
    BuyDialog.show() ;

    //NOW, after showing the dialog, we can access its widgets
    jobject_SeekBar_buy= (SeekBar) BuyDialog.findViewById(R.id.SeekBar_Dialog_Buy) ;
    jobject_SeekBar_buy.setMax(PR_num_coins/currentPR_buy_price) ;
    jobject_SeekBar_buy.setOnSeekBarChangeListener(this);

}
public void Action_Buy_PR(View view) {
    BuyDialog.dismiss() ;
}

レイアウトxmlでonClick属性を使用すると、AndroidダイアログでNoSuchMethodExceptionが発生しますが、このコンテキストの問題を理解できません。

于 2012-09-25T21:20:08.437 に答える
0

ダイアログはContextThemeWrapperを使用します

今、私たちが得ている例外...

java.lang.IllegalStateException: Could not find a method android:onClick="method" 
in the activity class android.view.ContextThemeWrapper
for onClick handler on view class android.widget.RadioButton with id 'statusSuspend'

これを取り除くには、適切なインフレータを使用してください

代わりにLayoutInflater.from(context)

  1. ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE))

  2. getLayoutInflater()

void setContentView(int layoutResID)を避け、代わりにvoid setContentView(View view)を使用してください

そして、Dialogコンストラクターで同じコンテキストを使用します。つまり、super(context)

最後に、カスタムクラスの代わりにActivityでandroid:onClick="method"を定義することを忘れないでください

于 2014-10-08T18:05:13.403 に答える