質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

193閲覧

Android studio new androidx.appcompat.app.AlertDialog.Builderの引数Activityについて

tanuki_

総合スコア39

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2024/10/24 01:24

実現したいこと

・A画面からB画面に遷移してB画面にてスレッドで処理を行いA画面に遷移する。
・スレッド内でエラーが発生した場合アラートダイアログを表示したい。
・アラートダイアログを表示するタイミングでは既にA画面に遷移している為A画面にアラートダイアログを表示したい。

発生している問題・分からないこと

new androidx.appcompat.app.AlertDialog.Builder(引数:Activity)
引数:ActivityにA画面を指定したいが方法が分かりません。

該当のソースコード

java

1スレッド処理内にてアラートダイアログを表示する処理 2 public void alertToShowByTelegramErrorOfReserveInsertUpdate(@NonNull Activity activity, String errorCode, Class returnToClass) { 3 FileUtils.outputLogFile(activity.getApplicationContext(), Constants.LOG_ALERT, "伝文エラー:" + errorCode, null); 4 // Activity画面の操作を無効にする 5 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 6 7 boolean mDialogFrag = true; 8 9 // タイトルとメッセージの生成 10 String title; 11 String message; 12 if (errorCode.equals("B8")) { 13 // 「B8」エラーの場合のみ異なるメッセージを出す 14 title = "登録エラー"; 15 message = "予約を完了する事が出来ませんでした"; 16 17 } else { 18 title = activity.getString(R.string.confirm_telegram_error_title); 19 message = activity.getString(R.string.confirm_telegram_message) + "\nエラーコード:" + errorCode; 20 } 21 22 if (mDialogFrag) { 23 final androidx.appcompat.app.AlertDialog alertToShow = new androidx.appcompat.app.AlertDialog.Builder(activity) 24 .setTitle(title) 25 .setMessage(message) 26 .setPositiveButton("閉じる", (dialog, which) -> { 27 }) 28 .create(); 29 alertToShow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 30 alertToShow.show(); 31 mDialogFrag = false; 32 } 33 }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Activityの取得方法で検索しましたが結果を得られませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

複数のアクティビティ間で処理をアレコレすることはとても面倒くさく、またOSにもそこそこ負担です。
(質問ではBからAへの遷移が常に成功する前提のようですが、遷移した瞬間にAが居なくなる可能性もあります。)
アクティビティをアプリで1つだけとし、各画面をフラグメントで構成してフラグメントを入れ換えることで画面遷移を実現すれば、悩まずに済むと思います。
(ついでに、ダイアログもそのまま使うとアクティビティが再生成されたときにダイアログは再生成されません。ダイアログフラグメントを使うと再生成されます。)


テキトウに作ったサンプルです。AからBに行きスレッドを実行すると3秒後(その間にAに戻って)ダイアログが出ます。

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2import androidx.fragment.app.*; 3import androidx.lifecycle.*; 4 5import android.os.Bundle; 6 7public class MainActivity extends AppCompatActivity { 8 enum Transfer { 9 A() { Fragment createFragment() { return new AFragment(); } }, 10 B() { Fragment createFragment() { return new BFragment(); } }; 11 abstract Fragment createFragment(); 12 } 13 14 private static String TELEGRAM_ALERT_DIALOG_TAG = "TelegramAlertDialog"; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 FragmentManager fm = getSupportFragmentManager(); 22 23 MainViewModel model = new ViewModelProvider(this).get(MainViewModel.class); 24 model.getTransfer().observe(this, transfer -> { 25 if(transfer == null) return; 26 fm.beginTransaction() 27 .replace(R.id.fragment_container_view, transfer.createFragment()) 28 .commit(); 29 }); 30 31 model.getTelegramErrorCode().observe(this, errorCode -> { 32 if(errorCode == null || errorCode.isEmpty() || fm.findFragmentByTag(TELEGRAM_ALERT_DIALOG_TAG) != null) return; 33 AlertDialogFragment.getInstance(errorCode).show(fm, TELEGRAM_ALERT_DIALOG_TAG); 34 model.setTelegramErrorCode(null); 35 }); 36 37 if(savedInstanceState == null) { 38 model.setTransfer(Transfer.A); 39 } 40 } 41}

layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/fragment_container_view" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" />

MainViewModel.java

java

1import androidx.lifecycle.*; 2 3public class MainViewModel extends ViewModel { 4 private MutableLiveData<MainActivity.Transfer> transferLiveData = new MutableLiveData<>(); 5 LiveData<MainActivity.Transfer> getTransfer() { 6 return transferLiveData; 7 } 8 void setTransfer(MainActivity.Transfer transfer) { 9 transferLiveData.setValue(transfer); 10 } 11 12 private MutableLiveData<String> telegramErrorCodeLiveData = new MutableLiveData<>(); 13 LiveData<String> getTelegramErrorCode() { 14 return telegramErrorCodeLiveData; 15 } 16 void setTelegramErrorCode(String errorCode) { 17 telegramErrorCodeLiveData.setValue(errorCode); 18 } 19 20 void startThread() { 21 new Thread( 22 () -> { 23 try { 24 Thread.sleep(3 * 1000); //[ms] 25 } catch(InterruptedException e) { 26 telegramErrorCodeLiveData.postValue("B8"); 27 return; 28 } 29 telegramErrorCodeLiveData.postValue("ABCDEF"); 30 } 31 ).start(); 32 } 33}

AlertDialogFragment.java

java

1import android.app.Dialog; 2import android.content.Context; 3import android.os.Bundle; 4 5import androidx.annotation.*; 6import androidx.appcompat.app.AlertDialog; 7import androidx.fragment.app.DialogFragment; 8 9public class AlertDialogFragment extends DialogFragment { 10 static DialogFragment getInstance(String errorCode) { 11 if(errorCode == null || errorCode.length() == 0) return null; 12 13 DialogFragment df = new AlertDialogFragment(); 14 Bundle args = new Bundle(); 15 args.putString("ErrorCode", errorCode); 16 df.setArguments(args); 17 return df; 18 } 19 20 @NonNull 21 @Override 22 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { 23 String errorCode = requireArguments().getString("ErrorCode", null); 24 FileUtils.outputLogFile(getContext(), Constants.LOG_ALERT, "伝文エラー:" + errorCode, null); 25 26 // タイトルとメッセージの生成 27 String title, message; 28 if (errorCode.equals("B8")) { //「B8」エラーの場合のみ異なるメッセージを出す 29 title = "登録エラー"; 30 message = "予約を完了する事が出来ませんでした"; 31 } else { 32 title = getString(R.string.confirm_telegram_error_title); 33 message = getString(R.string.confirm_telegram_message) + "\nエラーコード:" + errorCode; 34 } 35 36 setCancelable(false); //false でダイアログ外のタッチやバック操作でのダイアログのキャンセルを出来なくする. 37 38 return new AlertDialog.Builder(requireActivity()) 39 .setTitle(title) 40 .setMessage(message) 41 .setPositiveButton("閉じる", (d, w) -> {}) 42 .create(); 43 } 44} 45 46//テスト用ダミー 47enum Constants { 48 LOG_ALERT 49} 50class FileUtils { 51 static void outputLogFile(Context context, Constants constants, String contents, Object obj) {} 52}

AFragment.java

java

1import android.os.Bundle; 2import android.view.View; 3import android.widget.Button; 4 5import androidx.annotation.*; 6import androidx.fragment.app.Fragment; 7import androidx.lifecycle.ViewModelProvider; 8 9public class AFragment extends Fragment { 10 public AFragment() { 11 super(R.layout.fragment_a); 12 } 13 14 @Override 15 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 16 super.onViewCreated(view, savedInstanceState); 17 18 MainViewModel model = new ViewModelProvider(requireActivity()).get(MainViewModel.class); 19 20 Button toB = view.findViewById(R.id.toB_button); 21 toB.setOnClickListener(v -> model.setTransfer(MainActivity.Transfer.B)); 22 } 23}

layout/fragment_a.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:background="#ffc0c0" 8 tools:context=".AFragment"> 9 10 <TextView 11 android:id="@+id/text" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="A" 15 android:textSize="50dp" 16 app:layout_constraintBottom_toBottomOf="parent" 17 app:layout_constraintEnd_toEndOf="parent" 18 app:layout_constraintStart_toStartOf="parent" 19 app:layout_constraintTop_toTopOf="parent" /> 20 <Button 21 android:id="@+id/toB_button" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="to B" 25 app:layout_constraintBottom_toBottomOf="parent" 26 app:layout_constraintEnd_toEndOf="parent" 27 app:layout_constraintStart_toStartOf="parent" 28 app:layout_constraintTop_toBottomOf="@id/text" /> 29</androidx.constraintlayout.widget.ConstraintLayout>

BFragment.java

java

1import android.os.Bundle; 2import android.view.View; 3import android.widget.Button; 4 5import androidx.annotation.*; 6import androidx.fragment.app.Fragment; 7import androidx.lifecycle.ViewModelProvider; 8 9public class BFragment extends Fragment { 10 public BFragment() { 11 super(R.layout.fragment_b); 12 } 13 14 @Override 15 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 16 super.onViewCreated(view, savedInstanceState); 17 18 MainViewModel model = new ViewModelProvider(requireActivity()).get(MainViewModel.class); 19 20 Button threadButton = view.findViewById(R.id.thread_button); 21 threadButton.setOnClickListener(v -> { 22 model.startThread(); 23 model.setTransfer(MainActivity.Transfer.A); 24 }); 25 } 26}

layout/fragment_b.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:background="#80ffff" 8 tools:context=".BFragment"> 9 10 <TextView 11 android:id="@+id/text" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="B" 15 android:textSize="50dp" 16 app:layout_constraintBottom_toBottomOf="parent" 17 app:layout_constraintEnd_toEndOf="parent" 18 app:layout_constraintStart_toStartOf="parent" 19 app:layout_constraintTop_toTopOf="parent" /> 20 <Button 21 android:id="@+id/thread_button" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="thread" 25 app:layout_constraintBottom_toBottomOf="parent" 26 app:layout_constraintEnd_toEndOf="parent" 27 app:layout_constraintStart_toStartOf="parent" 28 app:layout_constraintTop_toBottomOf="@id/text" /> 29</androidx.constraintlayout.widget.ConstraintLayout>

投稿2024/10/24 15:34

編集2024/10/30 13:38
jimbe

総合スコア13168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問