0

インターネットがオフラインのときにダイアログ ボックスを表示するように実装しています。アプリを実行すると、ボタンをクリックしてアプリケーションがクラッシュすると、「FATAL Exception main」と ClassCastException が発生します。誰かが私が間違っていることを教えてもらえますか? アドバンスであなたに感謝します。

インターネットが有効になっているかどうかを確認するコードは次のとおりです。

public class AndroidDetectInternetConnectionActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnStatus = (Button) findViewById(R.id.btn_check);

        btnStatus.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                if (!isOnline())
                {
                    showNoConnectionDialog(this);

                }
            }

        });

    }

    public static void showNoConnectionDialog(OnClickListener onClickListener) 
    {
        final Context ctx = (Context) onClickListener;
        AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
        builder.setCancelable(true);
        builder.setMessage(R.string.no_connection);
        builder.setTitle(R.string.no_connection_title);
        builder.setPositiveButton(R.string.settings_button_text, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) 
            {

                ctx.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
            }
        });

        builder.setNegativeButton(R.string.cancel_button_text, new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int which) 
            {
                return;
            }
        });

        builder.setOnCancelListener(new DialogInterface.OnCancelListener() 
        {
            public void onCancel(DialogInterface dialog) {
                return;
            }
        });

        builder.show();
    }

    public boolean isOnline() 
    {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) 
        {
            return true;
        }
        return false;
    }

}

// これは Log Cat スタック トレースです

11-15 11:57:19.115: D/AndroidRuntime(453): Shutting down VM
11-15 11:57:19.115: W/dalvikvm(453): threadid=1: thread exiting with uncaught exception (group=0x40015560)
11-15 11:57:19.122: E/AndroidRuntime(453): FATAL EXCEPTION: main
11-15 11:57:19.122: E/AndroidRuntime(453): java.lang.ClassCastException: com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity$1
11-15 11:57:19.122: E/AndroidRuntime(453):  at com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity.showNoConnectionDialog(AndroidDetectInternetConnectionActivity.java:99)
11-15 11:57:19.122: E/AndroidRuntime(453):  at com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity$1.onClick(AndroidDetectInternetConnectionActivity.java:64)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.view.View.performClick(View.java:2485)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.view.View$PerformClick.run(View.java:9080)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.os.Handler.handleCallback(Handler.java:587)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.os.Looper.loop(Looper.java:123)
11-15 11:57:19.122: E/AndroidRuntime(453):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-15 11:57:19.122: E/AndroidRuntime(453):  at java.lang.reflect.Method.invokeNative(Native Method)
11-15 11:57:19.122: E/AndroidRuntime(453):  at java.lang.reflect.Method.invoke(Method.java:507)
11-15 11:57:19.122: E/AndroidRuntime(453):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-15 11:57:19.122: E/AndroidRuntime(453):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-15 11:57:19.122: E/AndroidRuntime(453):  at dalvik.system.NativeStart.main(Native Method)
11-15 11:57:24.892: I/Process(453): Sending signal. PID: 453 SIG: 9
4

3 に答える 3

2

この問題を解決するには 2 つの方法があります。

1)showNoConnectionDialog(this);以降: public static void showNoConnectionDialog(Context ctx) ...

2)showNoConnectionDialog();以降:public void showNoConnectionDialog() { Context ctx = AndroidDetectInternetConnectionActivity.this

于 2013-11-15T07:34:46.427 に答える
2

この行を変更

 final Context ctx = (Context) onClickListener;

1つ下まで

 final Context ctx = AndroidDetectInternetConnectionActivity.this;

基本的に、 onClickListener を Contex に変換しようとしていますが、これは正しくなく、キャストできません。ActivityName.thisコンテキストインスタンスが必要な場所ならどこでも直接使用するか、クラス変数として定義して、この行を追加するだけで初期化し、使用する前に初期化することを忘れないでください。static Context ctxonCreate()ctx =this

楽しみ

于 2013-11-15T06:43:39.103 に答える
0

基本的な問題は、次の行によって生成されます。

最終コンテキスト ctx = (コンテキスト) onClickListener;

これは単純にコンテキストではないため、強制的にコンテキストにしようとしてもうまくいきません。

あなたがやりたかったのは、コンテキスト(またはアクティビティ)をこの関数に渡すことだったと思います(現在渡している名前のないローカルの OnClickListener クラスとは対照的に)

最も簡単な解決策は、コンストラクターに何も渡さず、 AndroidDetectInternetConnectionActivity.this を使用して有効なコンテキストにアクセスすることです。

于 2013-11-15T06:43:53.473 に答える