###前提・実現したいこと
使っている開発ツール:
AndroidStudio
現在教本を参考にしながら簡単なサンプルアプリの改修を
行っているのですが、思ったように動かせません。
やりたいこととしては、
画面上に、押せるなにかしらの画像を配置し、その画像を
タップした際にダイアログメッセージの表示とともに
画像が別の画像に挿げ変わる、という実装をしたいです。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
//ボタンとダイアログ public class ButtonEx extends Activity implements View.OnClickListener{ private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT; private final static String TAG_MESSAGE = "0"; private final static String TAG_YESNO = "1"; private final static String TAG_TEXT = "2"; private final static String TAG_IMAGE = "3"; private static boolean imgOk = true; private Context context; private int waitperiod = 1000; //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle){ System.out.println("onCreate実行"); super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //レイアウトの生成 LinearLayout layout = new LinearLayout(this); layout.setBackgroundColor(Color.WHITE); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //ボタンの生成 layout.addView(makeButton("メッセージダイアログの表示", TAG_MESSAGE)); layout.addView(makeButton("Yes/Noダイアログの表示", TAG_YESNO)); layout.addView(makeButton("テキスト入力ダイアログの表示", TAG_TEXT)); if(imgOk == true){ System.out.println("目をつぶる"); layout.addView(makeButton(res2bmp(this, R.drawable.sample), TAG_IMAGE)); }else{ System.out.println("目をひらく"); layout.addView(makeButton(res2bmp(this, R.drawable.sample2), TAG_IMAGE)); } } //疑似再描画用メソッド public void restart(Context cnt, int period){ // intent 設定で自分自身のクラスを設定 Intent buttonEx = new Intent(cnt, ButtonEx.class); // PendingIntent , ID=0 PendingIntent pendingIntent = PendingIntent.getActivity(cnt, 0, buttonEx, PendingIntent.FLAG_CANCEL_CURRENT); // AlarmManager のインスタンス生成 AlarmManager alarmManager = (AlarmManager)cnt.getSystemService(Context.ALARM_SERVICE); // 1回のアラームを現在の時間からperiod秒後に実行させる alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + period, pendingIntent); // アプリ終了 finish(); } //ボタンの生成 private Button makeButton(String text, String tag){ Button button = new Button(this); button.setText(text); button.setTag(tag); button.setOnClickListener(this); button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); button.invalidate(); return button; } //イメージボタンの生成 private ImageButton makeButton(Bitmap bmp,String tag){ ImageButton button = new ImageButton(this); button.setTag(tag); button.setOnClickListener(this); button.setImageBitmap(bmp); button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); button.invalidate(); return button; } //リソース→ビットマップ public Bitmap res2bmp(Context context, int resID){ return BitmapFactory.decodeResource(context.getResources(), resID); } //ボタン押下時に呼ばれる public void onClick(View view){ String tag = (String)view.getTag(); if(TAG_MESSAGE.equals(tag)){ MessageDialog.show(this, "メッセージダイアログ", "ボタンを押した"); }else if(TAG_YESNO.equals(tag)){ YesNoDialog.show(this, "Yes/Noダイアログ", "Yes/Noを選択"); }else if(TAG_TEXT.equals((tag))){ TextDialog.show(this, "テキスト入力ダイアログ", "テキストを入力"); }else if(TAG_IMAGE.equals(tag)){ if(imgOk){ imgOk = false; }else{ imgOk = true; } MessageDialog.show(this, "", "イメージボタンを押した"); //画像の再描画のやり方がわからないので、 // アプリごと再起動するための設定 context = getApplicationContext(); waitperiod = 1; //restart(context, waitperiod); } } //イメージダイアログの定義 public static class MessageDialog extends DialogFragment{ //ダイアログの表示 public static void show(Activity activity, String title, String text){ MessageDialog f = new MessageDialog(); Bundle args = new Bundle(); args.putString("title", title); args.putString("text", text); f.setArguments(args); f.show(activity.getFragmentManager(), "messageDialog"); } //ダイアログの生成 @Override public Dialog onCreateDialog(Bundle bundle){ AlertDialog.Builder ad = new AlertDialog.Builder(getActivity()); ad.setTitle(getArguments().getString("title")); ad.setMessage(getArguments().getString("text")); ad.setPositiveButton("OK", null); return ad.create(); } } //Yes/Noダイアログの定義 public static class YesNoDialog extends DialogFragment{ //ダイアログの表示 public static void show(Activity activity, String title, String text){ YesNoDialog f = new YesNoDialog(); Bundle args = new Bundle(); args.putString("title", title); args.putString("text", text); f.setArguments(args); f.show(activity.getFragmentManager(), "yesNoDialog"); } //Yes/Noダイアログの生成 @Override public Dialog onCreateDialog(Bundle bundle) { //リスナーの生成 DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { //ダイアログボタン押下時に呼ばれる public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { MessageDialog.show(getActivity(), "", "YES"); } else if (which == DialogInterface.BUTTON_NEGATIVE) { MessageDialog.show(getActivity(), "", "NO"); } } }; //Yes/Noダイアログの生成 AlertDialog.Builder ad = new AlertDialog.Builder(getActivity()); ad.setTitle(getArguments().getString("title")); ad.setMessage(getArguments().getString("text")); ad.setPositiveButton("Yes", listener); ad.setNegativeButton("No", listener); return ad.create(); } } //テキスト入力ダイアログの定義 public static class TextDialog extends DialogFragment{ private EditText editText; //ダイアログの表示 public static void show(Activity activity, String title, String text){ TextDialog f = new TextDialog(); Bundle args = new Bundle(); args.putString("title", title); args.putString("text", text); f.setArguments(args); f.show(activity.getFragmentManager(), "textDialog"); } //テキスト入力ダイアログの生成 @Override public Dialog onCreateDialog(Bundle bundle){ //リスナーの生成 DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { //ダイアログボタン押下時に呼ばれる @Override public void onClick(DialogInterface dialog, int which) { if(editText.getText().toString().equals("")){ MessageDialog.show(getActivity(), "", "何も入力されませんでした"); }else{ MessageDialog.show(getActivity(), "", editText.getText().toString()); } } }; //エディットテキストの生成 editText = new EditText(getActivity()); //テキスト入力ダイアログの生成 AlertDialog.Builder ad = new AlertDialog.Builder(getActivity()); ad.setTitle(getArguments().getString("title")); ad.setMessage(getArguments().getString("text")); ad.setView(editText); ad.setPositiveButton("OK", listener); //フラグメントの状態復帰 if(bundle != null) editText.setText(bundle.getString("editText", "")); return ad.create(); } //フラグメントの状態保存 @Override public void onSaveInstanceState(Bundle bundle){ super.onSaveInstanceState(bundle); bundle.putString("editText", editText.getText().toString()); } } }
###試したこと
ソースコードには画像以外の関係ない処理も入っています。
現在はどうしても画像の再描画のやり方がわからなく、
強制的にアプリの再起動を行うという荒業を使って
むりやりもう一度Activityを再起動させ、
onCreate()メソッドを呼び出し再描画を行う
という方法を採っています。
invalidate()メソッドによる再描画も試してみたのですが変わりませんでした・・・。
色々と調べていると根本的ななにかが足りないのではないかと感じています。
どうかご教示のほど宜しくお願い致します。
###補足情報(言語/FW/ツール等のバージョンなど)
言語:Java
FW:Android6.0環境
開発ツールver:AndroidStudio2.1
回答3件
あなたの回答
tips
プレビュー