0

ユーザーが無効なデータを検索フィールドに入力したときに、ダイアログ ボックスを表示しようとしています。入力検証を含む検索アクションはすべて で実行さAsyncTaskMain Activityます。ダイアログの作成者は、メイン アクティビティの外側の外部クラスにあります。

を取得してJSON Array、結果がないかどうかを確認します。結果がない場合は、ダイアログを介してユーザーに知らせたいと思います。これは拡張する私のメインにありますActivity

try{
            results = jSon.getJSONArray(TAG_RESULTS);


            Log.d("results as string", results.toString());
            String strResults = results.toString();
            if(!strResults.equals("[]")){


                for(int i = 0; i < results.length(); i++){
                    JSONObject r = results.getJSONObject(i);
                    firstID = r.getString(TAG_ID);

                }
            }
            else{

                DialogFragment newFragment = new NoResult();
                newFragment.show(getFragmentManager(), "noresult");
            }
        }
        catch(JSONException e){
            Log.e("Error", e.toString());
        }

これが私のDialog創造者です

public class NoResult extends DialogFragment  {

public void customCreate(final Context context){
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(R.string.no_result)
    .setPositiveButton(R.string.back_to_one, DialogInterface.OnClickListener(){
               public void onClick(DialogInterface dialog, int d){
               //Try Again
               Intent intent = new Intent(context, Main.class);
               context.startActivity(intent);

    }

});

};


}

結果が [] と等しい場合でも、アプリは残りのコードを実行し、無効な API クエリ URL を組み立てます。logcatAPIクエリのエラーが原因で、最後のステップである結果アクティビティを表示すると、アプリがクラッシュすることがわかります。

これは、無効な入力を見つけてダイアログが表示されなかった後に照会されるリンクです: http://api.themoviedb.org/3/person/null/credits?api_key=apikey

nullはID 番号である必要がありますが、それをキャッチするはずの if else の後に検索がまだ無効なデータで実行されているため、そうではありません。

ログキャット:

06-20 02:49:29.091: E/AndroidRuntime(5599): FATAL EXCEPTION: main
06-20 02:49:29.091: E/AndroidRuntime(5599): java.lang.RuntimeException: Unable to start     activity      ComponentInfo{com.tot.tipofthetongue/com.tot.tipofthetongue.DisplayResultsActivity}:     java.lang.NullPointerException
06-20 02:49:29.091: E/AndroidRuntime(5599):     at     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.os.Looper.loop(Looper.java:137)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.ActivityThread.main(ActivityThread.java:5041)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at java.lang.reflect.Method.invokeNative(Native Method)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at java.lang.reflect.Method.invoke(Method.java:511)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at dalvik.system.NativeStart.main(Native Method)
06-20 02:49:29.091: E/AndroidRuntime(5599): Caused by: java.lang.NullPointerException
06-20 02:49:29.091: E/AndroidRuntime(5599):     at com.tot.tipofthetongue.DisplayResultsActivity.onCreate(DisplayResultsActivity.java:28)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.Activity.performCreate(Activity.java:5104)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-20 02:49:29.091: E/AndroidRuntime(5599):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-20 02:49:29.091: E/AndroidRuntime(5599):     ... 11 more
4

2 に答える 2

0

使用する場合は、 onCreateViewまたはonCreateDialogDialogFragmentをオーバーライドする必要があります

これがドキュメントの言うことです

実装では、このクラスをオーバーライドし、onCreateView(LayoutInflater, ViewGroup, Bundle)を実装して、ダイアログのコンテンツを提供する必要があります。または、 onCreateDialog(Bundle)をオーバーライドして、AlertDialog などの完全にカスタムのダイアログを独自のコンテンツで作成することもできます。

こちらのドキュメントを参照してください

于 2013-06-20T10:53:35.707 に答える