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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

5013閲覧

Android Studio)Adapter内のDialogが落ちる

navesanta

総合スコア198

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2017/09/11 08:44

recyclerviewでリストを作成してリストの1つをタップした時に
Dialogが起ち上がるアプリを作っています。

まず
MainActivity上にClicklistnenerでボタンを設置しました。
次に
Adapter内にもClicklistnenerを設置してrecyclerviewのリストを押した時に
Dialogが起ち上がるようにしました。
しかしMainActivity上にボタンをした時は問題なくDialogが起ちあがるのですが
recyclerviewのリストをタップすると下記のエラーが出て落ちてしまいます。

error内容

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

このエラーをネット検索で調べるとたくさん質問が出ていて回答もたくさんありました。
回答のほとんどがstyle.xmlとAndroidManifestのAppThemeをTheme.AppCompatに修正すれば
直ると言うのでしたが試しても解決しませんでした。

備考)
Adapter.javaはActivityではないのでcontextがないためMyApplication.javaを作って
MyApplication.getmContext().getApplicationContext()で
contextを取得してalertDialogBuilderに設置しました。
どうやらこれが怪しいのですがActivityクラスではないのでMainActivity.thisのような
contextの取得ができません。
(試しにMainActivityのDialogもcontextを
MyApplication.getmContext().getApplicationContext()にしたら落ちました。

質問は
・どういうcontextを設置(もしくは他の部分の間違っている部分の修正を)したら
Adapter.javaのDialogは落ちないのか?
・どうしてDialogにMyApplication.getmContext().getApplicationContext()を
設置したら落ちてしまうのか?

分かる方教えて下さい。よろしくお願いします。

MainActivity.java

Button addButton = (Button)findViewById(R.id.addButton); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this); alertDialogBuilder .setTitle("くじの結果追加") .setMessage("くじの結果内容を入力する") .setPositiveButton("保存", null) .setNegativeButton("キャンセル", null); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show();

Adapter.java内(抜粋)

@Override public void onBindViewHolder(final KujiViewHolder holder, final int listposition) { holder.kujiContents.setText(npwDataSet.get(listposition).getKuji_contents()); holder.kujiNumber.setText(npwDataSet.get(listposition).getKuji_number()); holder.base.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MyApplication.getmContext().getApplicationContext()); alertDialogBuilder .setTitle("くじの結果追加") .setMessage("くじの結果内容を入力する") .setPositiveButton("保存", null) .setNegativeButton("キャンセル", null); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show();

MyApplication.java

public class MyApplication extends Application { private static Context mContext; @Override public void onCreate(){ super.onCreate(); mContext = this; } public static Context getmContext(){ return mContext; } }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.XXXX.scratchmakerapp"> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.AppCompat.Light"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ResultActivity" /> <activity android:name=".SettingActivity"></activity> </application>

res/values/styles.xml

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>

環境 os mac
開発環境 Android studio 2.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

どういうcontextを設置(もしくは他の部分の間違っている部分の修正を)したら

Adapter.javaのDialogは落ちないのか?

Adapterに、コンストラクタでcontextをactivity側から渡してあげてください。viewの受け取るcontextは基本的にactivityのcontextであるべきです。この記事がcontextの理解を深めてくれると思いますよ。こちらでも、ダイアログを表示するときにerrorでクラッシュしています。

こちらがgetApplicationContext()ドキュメントですが、以下のようにActivityFragmentのライフサイクルに関わらず、アプリ自体のプロセスに関わるものにだけ使ってねと書いてあります。

This generally should only be used if you need a Context whose lifecycle is separate from the current context, that is tied to the lifetime of the process rather than the current component.

Adapter側

java

1class MyAdapter extends RecyclerView.Adapter { 2 private Context context; 3 4 public MyAdapter(Context context) { 5 this.context = context; 6 } 7 8 @Override 9 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 10 // contextを使う 11 } 12}

呼び出し側

java

1class MyActivity extends AppCompatActivity { 2 @Override 3 protected void onCreate(@Nullable Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 MyAdapter adapter = new MyAdapter(this); 6 } 7}

投稿2017/09/11 22:55

編集2017/09/13 01:07
hiramekun

総合スコア428

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

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

navesanta

2017/09/12 01:17

>Adapterに、コンストラクタでcontextをactivity側から渡してあげてください こちらの方法が分かりません。紹介していただいたページもactivitycontextとapplicationcontextの挙動に 関しては説明がされていますが具体的な「activity側からcontextを渡す方法」は記載されていません。 初歩的なことかもしれませんが「activity側からcontextを渡す方法」を教えて下さい。
hiramekun

2017/09/13 01:07

具体的な呼び出し方含めて回答を編集しましたので、ご参考ください
navesanta

2017/09/13 07:29

回答を編集いただきありがとうございます。 教えていただいたコードをそのままあてはめて実行しますとIllegalStateExceptionは解消されたのですが ヌルポで落ちてしまいます。 しかし不思議なことにToastでこのcontextを使った場合、落ちずに表示されます。 この不思議な現象が何か分かりません。もう少し調べてみます。とりあえずありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問