今回、BroadcastReceiver受信後のダイアログ表示として実装した中でエラーが発生してしまい、原因が分からず手詰まりとなってしまいました。
エラーが発生した状況は
BroadcastReceiver受信後OnCreateDialogのダイアログを表示し、STOPボタンを押したときに次のダイアログ(ShowDialogAsync)を表示。
ShowDialogAsyncのダイアログ表示を行った際に1回目の表示はうまく動作するのですが、2回目以降表示されません。
最終的な動作としてShowDialogAsyncの繰り返し表示の条件としてAnswersが4になるまで正常に繰り返し表示を行う事です。
何度も似たことを質問してしまい申し訳ありませんがよろしくお願い致します。
確認した流れ
while(await ShowDialogAsync())
を条件判定・実行1回目
ShowDialogAsync()を上から下まで実行
while文内の処理を実行
while(await ShowDialogAsync())
の条件判定・実行2回目
ShowDialogAsync()内の始めの処理var source = new TaskCompletionSource<bool>();
とLinearLayout layout_out = new LinearLayout(Activity) { Orientation = Orientation.Vertical };
を実行した後、if(Answers == 4)
のコメントの部分までスキップされエラーとなりました。
ここで以下のエラーコードが吐かれました。
エラーコード抜粋
UNHANDLED EXCEPTION:
02-05 12:29:52.313 I/MonoDroid( 3405): Java.Lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
[Activity(Label = "Alarm_Game")]
class AlertDialogFragment : Android.Support.V4.App.DialogFragment
{
//答え
public int Answer = 0;
//式
public string Formula = "";
//何問目か
public int Answers = 1;
public int Nanido = 1;
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
Game_Process gp = new Game_Process();
AlertDialog.Builder builder = new AlertDialog.Builder(Activity);
//レイアウトを作成
LayoutInflater inflater = (LayoutInflater)Activity.GetSystemService(Context.LayoutInflaterService);
View content = inflater.Inflate(Resource.Layout.TestLayout, null);
View cnt = inflater.Inflate(Resource.Layout.TestLayout, null);
Button alarm_stop = cnt.FindViewById<Button>(Resource.Id.al_stop);
Button alarm_snz = cnt.FindViewById<Button>(Resource.Id.snz_btn);
builder.SetPositiveButton("STOP", async (sender, e) =>
{
//ランダム値生成と代入
gp.Randoms(Nanido);
Formula = gp.formula;
Answer = gp.answer;
while (await ShowDialogAsync())
{
Console.WriteLine("await内");
gp.Randoms(Nanido);
Formula = gp.formula;
Answer = gp.answer;
}
});
builder.SetView(content);
Dialog dialog = builder.Create();
dialog.SetCanceledOnTouchOutside(false);
return dialog;
}
public AlertDialog.Builder builder;
public Task<bool> ShowDialogAsync()
{
var source = new TaskCompletionSource<bool>();
//レイアウト
LinearLayout layout_out = new LinearLayout(Activity) { Orientation = Orientation.Vertical };
layout_out.SetGravity(GravityFlags.Left);
var input_ans = new EditText(Activity);
input_ans.InputType = Android.Text.InputTypes.ClassNumber;
layout_out.AddView(new TextView(Activity) { Text = "3個中" + Answers + "個目", TextSize = 30 });
layout_out.AddView(new TextView(Activity) { Text = Formula, TextSize = 30 });
layout_out.AddView(input_ans);
Console.WriteLine("builder:"+builder);
if (builder == null)
{
builder = new AlertDialog.Builder(Activity);
builder.SetTitle("回答しなさい");
builder.SetView(layout_out);
builder.SetPositiveButton("OK", (s, a) =>
{
int input_i = 0;
if (input_ans.Text == null)
{
//NULLの場合何もしない
}
else
{
string input_s = input_ans.Text;
input_i = int.Parse(input_s);
}
if (input_i == Answer)
{
Answers++;
}
if (Answers == 4)
{
source.SetResult(false);
Answers = 1;
}
else
{
source.SetResult(true);
} //ここのカッコまでスキップ
});
}
builder.Show();
return source.Task;
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる