23971


はじめて質問させていただきます。  
Android開発及びJava初心者です。

「ボタンをクリックすると、ラジオボタン型のアラートダイアログが表示され項目を選択すると  
MainActivity内のTextViewに選択した項目の内容が表示される」という内容のプログラムを作りたいと思っております。

以下のコードで実行するとアラートダイアログが表示された後項目を選択したタイミングでエラーが発生してしまいます。

ネットで検索などをして調べてみたのですが、原因がわかりませんでした。  
どなたか原因を教えていただけたらと思います。

よろしくお願いします。

ソースコード  
↓↓↓

[code]

    import android.app.Activity; 
    import android.app.Dialog; 
    import android.app.DialogFragment; 
    import android.app.ProgressDialog; 
    import android.content.DialogInterface; 
    import android.os.CountDownTimer; 
    import android.support.v7.app.AlertDialog; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 
    
    import java.util.List; 
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
    
        @Override 
         protected void onCreate(Bundle savedInstanceState) { 
             super.onCreate(savedInstanceState); 
             setContentView(R.layout.activity_main); 
    
            findViewById(R.id.ok).setOnClickListener(this); 
             findViewById(R.id.progress).setOnClickListener(this); 
             findViewById(R.id.single).setOnClickListener(this); 
             findViewById(R.id.multi).setOnClickListener(this); 
             findViewById(R.id.edit).setOnClickListener(this); 
         } 
    
        @Override 
         public void onClick(View v) { 
             String[] items = {"A","B","C","D"}; 
             int id = v.getId(); 
             if(id == R.id.ok){ 
                 OkDialog.showDialog(this,"OKダイアログ","ボタンを押した"); 
             }else if(id == R.id.progress){ 
                 MyProgressDialog.showDialog(this,"プログレスダイアログ",100); 
             }else if(id == R.id.single){ 
                 SingleDialog.showDialog(this,"シングルチョイスダイアログ",items); 
             }else if(id == R.id.multi){ 
                 MultiDialog.showDialog(this,"マルチチョイスダイアログ",items); 
             }else if(id == R.id.edit){ 
                 EditDialog.showDialog(this,"エディットダイアログ","テキストを入力"); 
             } 
         } 
    
    //シングルチョイスダイアログ 
        public static class SingleDialog extends DialogFragment{ 
             //表示 
            public static void showDialog(Activity activity,String title,String[] items){ 
                 SingleDialog singleDialog = new SingleDialog(); 
                 Bundle args = new Bundle(); 
                 args.putString("title",title); 
                 args.putStringArray("items",items); 
                 singleDialog.setArguments(args); 
                 singleDialog.show(activity.getFragmentManager(),"singleDialog"); 
             } 
    
            //生成 
            @Override 
             public Dialog onCreateDialog(Bundle bundle) { 
                 final String[] items = getArguments().getStringArray("items"); 
    
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
                 builder.setTitle(getArguments().getString("title")); 
                 builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
                     @Override 
                     public void onClick(DialogInterface dialog, int which) { 
                         MainActivity activity = new MainActivity(); 
                         ((TextView)activity.findViewById(R.id.textView)).setText(items[which] + "が選択されました"); 
                     } 
                 }); 
                 builder.setPositiveButton("OK",null); 
             return builder.create(); 
             } 
         } 
    
[/code]

エラーメッセージ  
↓↓↓

[code]

     04-12 00:25:14.379 31269-31269/sample.dialog E/AndroidRuntime: FATAL EXCEPTION: main 
                                                                    Process: sample.dialog, PID: 31269 
                                                                    java.lang.NullPointerException 
                                                                        at android.app.Activity.findViewById(Activity.java:1884) 
                                                                        at sample.dialog.MainActivity$SingleDialog$1.onClick(MainActivity.java:136) 
                                                                        at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:958) 
                                                                        at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
                                                                        at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
                                                                        at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 
                                                                        at android.widget.AbsListView$3.run(AbsListView.java:3645) 
                                                                        at android.os.Handler.handleCallback(Handler.java:733) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                        at android.os.Looper.loop(Looper.java:149) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5045) 
                                                                        at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                        at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 
                                                                        at dalvik.system.NativeStart.main(Native Method) 
     04-12 00:25:16.219 31269-31269/sample.dialog I/Process: Sending signal. PID: 31269 SIG: 9 
    
[/code]


CC BY-SA 3.0
2016-04-11T17:01:26.483
23925
2016-04-12T16:36:08.110
2016-04-11T17:43:38.767
3605
15063
question
android java android-studio android-fragments
ラジオボタン型のアラートダイアログ内での選択項目をテキストビューに表示させたい

[code]

    @Override
    public void onClick(DialogInterface dialog, int which) {
        MainActivity activity = new MainActivity();
        ((TextView)activity.findViewById(R.id.textView)).setText(items[which] + "が選択されました");
    } 
    
[/code]

原因はこの部分ですね。

`Activity`をユーザーが`new`する状況はまずないと考えてください。`MainActivity`を`new`しても、そのタイミングではまだ`View`は作られていませんので、`findViewById()`の結果は`null`になります。（`onCreate()`で`setContentView()`したタイミングで、初めて`View`が生成されます）

このコードの意図は、「呼び出し元の`Activity`の`TextView`に、選択した結果を反映させたい」だと思いますので、

[code]

    @Override
    public void onClick(DialogInterface dialog, int which) {
        ((TextView) getActivity().findViewById(R.id.textView)).setText(items[which] + "が選択されました");
    }
    
[/code]

`getActivity()`を用いれば期待した動作になると思います。ただし、これはあまり良いコードであるとは言えません。

Android
Studioで`Fragment`を新規作成するとき、コールバック用のインターフェースの作成を選択できると思いますが、このとき生成されたテンプレートは`Activity`と`Fragment`をどのように連携させるのかを理解する良いサンプルだと思いますので、参考にしてみてください。


CC BY-SA 3.0
2016-04-12T16:02:42.863
23971
2016-04-12T16:36:08.110
2016-04-12T16:36:08.110
5337
5337
23925
answer