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

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

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

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

Android Studio

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

Q&A

解決済

2回答

4812閲覧

プログレスダイアログ-toastがエラーが起きる

mercurian-teto

総合スコア75

Java

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

Android Studio

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

0グッド

0クリップ

投稿2018/04/27 04:02

編集2018/04/28 18:01

このサイトを参考にしました。

プログレスダイアログが1.2分表示された後、toastでメッセージ表示させようかと思ったのですが、うまくいきません。一番下に主なコードを示しています。

if (target != null){ Toast.makeText(MyThread.this, "遅延ボタンが押されました", Toast.LENGTH_LONG).show(); target.dismiss();

if(target ! = null)の中が数秒立った後の処理内容だと思うのですが、

Toast.makeText(MyThread.this, "遅延ボタンが押されました", Toast.LENGTH_LONG).show();

のところが

can not resolve Toast.makeText(MyThread.this,"・・・)

というエラーが起きていました。
toastが間違えているのでしょうか。
いままで

Toast.makeText((クラス名).this, "遅延ボタンが押されました", Toast.LENGTH_LONG).show();

で大丈夫だと思っていたので、混乱します。
エラーの解除方法を教えてください。

//MainActivity.java package com.distractionapp.restrict.tienn; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.*; import android.app.ProgressDialog; import android.widget.Button; import android.widget.Toast; import javax.xml.transform.Result; public class MainActivity extends Activity { public ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button mPolicyAutoGrantedBtn = (Button) findViewById(R.id.btn); mPolicyAutoGrantedBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressDialog progressDialog; progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setCancelable(true); progressDialog.setTitle("処理中"); progressDialog.setMessage("計算中です。しばらくお待ちください。"); progressDialog.show(); MyThread myThread = new MyThread(); myThread.target = progressDialog; myThread.start(); } });} }
//MyThread.java package com.distractionapp.restrict.tienn; import android.app.ProgressDialog; import android.widget.Toast; /** * Created by programming on 2018/04/27. */ public class MyThread extends Thread { public ProgressDialog target; public void run(){ try{ this.sleep(5000); } catch(InterruptedException e){ } if (target != null){ Toast.makeText(MyThread.this, "遅延ボタンが押されました", Toast.LENGTH_LONG).show(); target.dismiss(); } } }

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

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

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

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

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

guest

回答2

0

自己解決

###別の解決策
このサイトを参考にしたら望み通りの仕様になりました。

public class MainActivity extends Activity { /** プログレスバー */ private ProgressDialog mPrgDlg; public final int minutes =600; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 実行中ダイアログの生成・初期化 mPrgDlg = new ProgressDialog(this); mPrgDlg.setTitle("スレッド実行中"); mPrgDlg.setMessage("しばらくお待ちください。"); mPrgDlg.setIndeterminate(false); mPrgDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); mPrgDlg.setMax(100); // 最大値 mPrgDlg.incrementProgressBy(0); // 初期値 // ボタンクリック処理 Button btnStart = (Button)findViewById(R.id.btn); btnStart.setOnClickListener(new OnClickListener() { public void onClick(View v) { // ダイアログ表示 mPrgDlg.show(); // スレッド生成・実行 Thread thread = new Thread(runnable); thread.start(); } }); } /** * スレッド処理 */ Runnable runnable = new Runnable() { public void run() { for (int i=0; i<100; i++) { try { Thread.sleep(100); mPrgDlg.setProgress(i+1); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } Message msg = new Message(); msg.arg1 = 0; handler.sendMessage(msg); } }; /** * スレッドの終了を受信するハンドラ */ private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 実行中ダイアログを閉じる mPrgDlg.dismiss(); Toast.makeText(MainActivity.this, "遅延ボタンが押されました", Toast.LENGTH_LONG).show(); }; }; @Override public void onPause(){ super.onPause(); finishAndRemoveTask(); } }

投稿2018/04/28 18:01

mercurian-teto

総合スコア75

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

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

0

Toast.makeText()の第1引数に求められるのはContext型の値です。ThreadはContextを継承していませんので、提示されたコードでは通りません。

一般的にはContextを継承しているActivityのインスタンス参照を渡しますので、第1引数にMainActivity.thisのような記述をしている例を目にされのだろうと思いまが、(クラス名).thisを第1引数に渡すのが「お約束」なのではなく、そのクラスがContextを継承したものである必要があるわけです。

この例であれば、

MyThread.java

Java

1public class MyThread extends Thread { 2 private Context mContext; 3 private Handler mHandler; 4 5 MyThread(Context context, Handler handler) { 6 mContext = context; 7 mHandler = handler; 8 } 9 10 // 中略 11 12 if (target != null){ 13 mHandler.post(new Runnable() { 14 @Override 15 public void run() { 16 Toast.makeText(mContext, "遅延ボタンが押されました", Toast.LENGTH_LONG).show(); 17 } 18 }); 19 target.dismiss(); 20 } 21

MainActivity.java

Java

1 MyThread myThread = new MyThread(MainActivity.this, new Handler());

のようにして、コンストラクターで渡せば良いかと思います。


(04/28 18:08)
提示したコードにミスがあったため、修正しました(エミュレーターで動作確認)。

投稿2018/04/27 09:01

編集2018/04/28 09:08
keicha_hrs

総合スコア6766

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

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

mercurian-teto

2018/04/28 08:36

すいません試してみたのですが、 MyThread myThread = new MyThread(this);のところが どうしても MyThread myThread = new MyThread(MainActivity.this);にしないとコンパイルが通りませんでした。それで実行してみたのですが、メッセージが表示されず、異常終了しました。 とりあえず、ほかの実装方法で望み通りになってしまう形になりました。 申し訳ありません。
keicha_hrs

2018/04/28 14:49 編集

MyThreadのインスタンスを生成しているのは、OnClickListenerを実装した匿名クラスの中ですね。この中でthisと記述するとその匿名クラスを指してしまいますから、MainActivityのインスタンス参照を渡したければMainActivity.thisと記述しなければなりませんでしたね。そこはご賢察の通りです。 また、Toastのshow()を実行するのは、UIを操作できるスレッドで行わなければならず、それ以外のスレッドで行うとアプリが飛んでしまいますね。この対処も確かに必要でした。ダブルミスで申し訳ありません・・・。 一応、提示したコードを動くものに修正しました。もちろん、参照された「他の方法」のままでも良いと思いますが、修正したものが少しでも参考になればと思います。
keicha_hrs

2018/04/28 09:19

ご自身で解決したコードを自己回答として投稿していただき、その投稿をベストアンサー(自己解決)として質問を解決済みに移行していたけたらと思います。
mercurian-teto

2018/04/28 18:00

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問