android.app.Dialog__showDialogメソッドの推奨に対して[java android]

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
LL

android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#1

投稿記事 by LL » 10年前

短時間での連投で申し訳ありません。
今回もSB Creativeから発刊されている[基礎からのAndroidプログラミング]からの質問です。
今度はアクティビティ管理のダイアログの部分(書籍ではp244)の部分を作っていたのですが、今度はshowDialogメソッドが非推奨という警告が出ましたので修正したいと思っています。
元のコードでは↓

コード:

package jp.denpa.dialog;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.app.AlertDialog;
import android.app.Dialog;


public class DialogActivity extends ActionBarActivity implements View.OnClickListener{
	static final int DIALOG_HELLO_ID = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViewById(R.id.button_dialog).setOnClickListener(this);
	}
	
	@Override
	protected Dialog onCreateDialog(int id){
		Dialog dialog;
		switch(id){
			case DIALOG_HELLO_ID:
				AlertDialog.Builder builder = new AlertDialog.Builder(this);
				builder.setTitle(R.string.app_name);
				builder.setMessage(R.string.hello_world);
				dialog = builder.create();
				break;
			default:
				dialog = null;
		}
		return dialog;
	}	
	
	public void onClick(View v){
	//	AlertDialog.Builder builder = new AlertDialog.Builder(this);
	//	builder.setTitle(R.string.app_name);
	//	builder.setMessage(R.string.hello_world);
	//	AlertDialog dialog = builder.create();
	//	dialog.show();
		showDialog(DIALOG_HELLO_ID);        //高APIでは非推奨という警告を発する
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.dialog, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

なのですが、いろいろ調べた結果、DialogFragmentを使用して作ればいいと言う部分までは分かりました。
しかし、サンプルコードの形を保ったまま(サンプルのswitch文の部分)DrawFragmentを実装する方法が分からずご助力いただきたいと思います。
参考書のサンプルコードを新たに推奨される形に書き直したらどれくらい変わってしまうのか知りたいです。
最後にこのコードは課題などではありません。

参考にしたサイト
http://www.jp-z.jp/changelog/2013-05-02-1.html

http://y-anz-m.blogspot.jp/2011/12/andr ... gment.html

http://dev.classmethod.jp/smartphone/an ... gfragment/

http://www115.sakura.ne.jp/~byunbyun/an ... oid12.html

http://developer.android.com/reference/ ... ivity.html

何かこの書籍に載っているコードの大半は非推奨警告出てばかりな気が・・・

ISLe()

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#2

投稿記事 by ISLe() » 10年前

コンパイルしてないのでエラーがあるかもしれませんが、こんな感じでしょうか。

コード:

package jp.denpa.dialog;
// import省略
public class DialogActivity extends ActionBarActivity implements View.OnClickListener
{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViewById(R.id.button_dialog).setOnClickListener(this);
	}

	public static class HelloDialogFragment extends DialogFragment {
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState) {
			AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
			builder.setTitle(R.string.app_name);
			builder.setMessage(R.string.hello_world);
			return builder.create();
		}
	}

	public void onClick(View v) {
		DialogFragment dlg = new HelloDialogFragment();
		dlg.show(getFragmentManager(), "tag");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.dialog, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
LL さんが書きました:何かこの書籍に載っているコードの大半は非推奨警告出てばかりな気が・・・
Androidはバージョンアップの間隔が短いし、UIが大きく変わることもありますしね。
次のバージョンでもUIが変わるんじゃなかったでしたっけ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#3

投稿記事 by softya(ソフト屋) » 10年前

私はDialogを継承したクラスでダイアログを描画しています。
AlertDialogの親クラスですね。やるもの次第ではAlertDialogも選択肢に入ると思います。
「Dialogs | Android Developers」
http://developer.android.com/guide/topi ... alogs.html

【補足】
ミニマムバージョンとターゲットバージョンによっては非推奨表示が出ないかもしれませんね。
どのバージョンのAndroid端末に向けて作るかも意識された方が良いかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#4

投稿記事 by LL » 10年前

ISLe() さんが書きました:コンパイルしてないのでエラーがあるかもしれませんが、こんな感じでしょうか。

コード:

package jp.denpa.dialog;
// import省略
public class DialogActivity extends ActionBarActivity implements View.OnClickListener
{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViewById(R.id.button_dialog).setOnClickListener(this);
	}

	public static class HelloDialogFragment extends DialogFragment {
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState) {
			AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
			builder.setTitle(R.string.app_name);
			builder.setMessage(R.string.hello_world);
			return builder.create();
		}
	}

	public void onClick(View v) {
		DialogFragment dlg = new HelloDialogFragment();
		dlg.show(getFragmentManager(), "tag");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.dialog, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
LL さんが書きました:何かこの書籍に載っているコードの大半は非推奨警告出てばかりな気が・・・
Androidはバージョンアップの間隔が短いし、UIが大きく変わることもありますしね。
次のバージョンでもUIが変わるんじゃなかったでしたっけ。
上記のコードではonClickメソッド内の
dlg.show(getFragmentManager(), "tag");
にてエラーが発生してしまいました。

エラーの内容は
型 DialogFragment のメソッド show(FragmentManager, String) は引数 (FragmentManager, String) に適用できません
と出ているのですが、要求される引数も、渡した値も同じはずなのにエラーが出てしまっていてよくわかりません。
要求されたとおりに渡しているはずなのにエラーが出るとしたらどういうような要因が考えられるのでしょうか?

また、最初にお話ししたとおり、switch 文の部分を『変えず』に実装したいのです。
最初に提示したプログラムには続きがあり、次のサンプルコードでは

コード:

package jp.denpa.alertdialogsample;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class AlertDialogSampleActivity extends ActionBarActivity implements View.OnClickListener, DialogInterface.OnClickListener,
																									DialogInterface.OnMultiChoiceClickListener{

	static final int DIALOG_1_ID = 0;
	static final int DIALOG_2_ID = 1;
	static final int DIALOG_3_ID = 2;
	static final int DIALOG_4_ID = 3;
	static final int DIALOG_5_ID = 4;
	
	private AlertDialog dialog1;
	private AlertDialog dialog2;
	private AlertDialog dialog3;
	private AlertDialog dialog4;
	private AlertDialog dialog5;
	
	private EditText mInputText;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
		findViewById(R.id.button3).setOnClickListener(this);
		findViewById(R.id.button4).setOnClickListener(this);
		findViewById(R.id.button5).setOnClickListener(this);
		mInputText = new EditText(this);
	}

	@Override
	protected Dialog onCreateDialog(int id){
		Dialog dialog;
		AlertDialog.Builder builder;
		final CharSequence items[] = {"red", "Orange", "Yellow", "Blue", "Indigo", "Violet"};
		boolean flags[]={true, false, true, false, true, false, true};

		switch(id){
			case DIALOG_1_ID:
				builder = new AlertDialog.Builder(this);
				builder.setTitle("ボタンのあるダイアログ");
				builder.setIcon(android.R.drawable.ic_dialog_alert);
				builder.setMessage("ボタンは最大3つまで表示できる");
				builder.setPositiveButton("OK", this);
				builder.setNeutralButton("キャンセル",this);
				builder.setNegativeButton("NG",this);
				dialog1 = builder.create();
				dialog = dialog1;
				break;
				
			case DIALOG_2_ID:
				builder = new AlertDialog.Builder(this);
				builder.setTitle("リストダイアログ");
				builder.setItems(items, this);
				builder.setNegativeButton("キャンセル", null);
				dialog2 = builder.create();
				dialog = dialog2;
				break;
				
			case DIALOG_3_ID:
				builder = new AlertDialog.Builder(this);
				builder.setTitle("ラジオボタンダイアログ");
				builder.setSingleChoiceItems(items, -1, this);
				builder.setNegativeButton("閉じる", null);
				dialog3 = builder.create();
				dialog = dialog3;	
				break;
				
			case DIALOG_4_ID:
				builder = new AlertDialog.Builder(this);
				builder.setTitle("チェックボックスダイアログ");
				builder.setMultiChoiceItems(items, flags, this);
				builder.setNegativeButton("閉じる", null);
				dialog4 = builder.create();
				dialog = dialog4;	
				break;
				
			case DIALOG_5_ID:
				builder = new AlertDialog.Builder(this);
				builder.setTitle("カスタムダイアログ");
				builder.setView(mInputText);
				builder.setNegativeButton("閉じる", null);
				dialog5 = builder.create();
				dialog = dialog5;	
				break;
				
				default:
					dialog = null;
		}
		return dialog;
	}
	
	//ボタンクリック時の処理
	@Override
	public void onClick(View v){
		switch(v.getId()){
			case R.id.button1:
				showDialog(DIALOG_1_ID);
				break;
			case R.id.button2:
				showDialog(DIALOG_2_ID);
				break;
			case R.id.button3:
				showDialog(DIALOG_2_ID);
				break;
			case R.id.button4:
				showDialog(DIALOG_3_ID);
				break;				
			case R.id.button5:
				showDialog(DIALOG_4_ID);
				break;
			default:
				break;
		}
	}
	
	//ダイアログがタップされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int id){
		if(dialog == dialog1){
			switch(id){
				case AlertDialog.BUTTON_POSITIVE:
					Toast.makeText(this, "一番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEUTRAL:
					Toast.makeText(this, "二番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEGATIVE:
					Toast.makeText(this, "三番目のボタン", Toast.LENGTH_LONG).show();
					break;					
				default:
					break;
			}
		}else if(dialog == dialog2){
			String item = dialog2.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog3){
			String item = dialog3.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog4){
			SparseBooleanArray positions = dialog4.getListView().getCheckedItemPositions();
			StringBuffer sb = new StringBuffer();;
			for(int i=0; i<positions.size(); i++){
				if(positions.valueAt(i)){
					sb.append(dialog4.getListView().getAdapter().getItem(positions.keyAt(i)).toString()).append(" ");
				}
			}
			Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
		}
	}
	
	//チェックボックスダイアログがクリックされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked){
		StringBuffer sb = new StringBuffer();
		sb.append(dialog4.getListView().getAdapter().getItem(which).toString());;
		if(isChecked){
			sb.append("がチェックされました");
		}else{
			sb.append("のチェックが外されました");
		}
		Toast.makeText(this,  sb.toString(), Toast.LENGTH_LONG).show();
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.alert_dialog_sample, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
となっており、タップされたボタンによって
(つまり)

コード:

    //ボタンクリック時の処理
    @Override
    public void onClick(View v){
        switch(v.getId()){
            case R.id.button1:
                showDialog(DIALOG_1_ID);
                break;
            case R.id.button2:
                showDialog(DIALOG_2_ID);
                break;
            case R.id.button3:
                showDialog(DIALOG_2_ID);
                break;
            case R.id.button4:
                showDialog(DIALOG_3_ID);
                break;              
            case R.id.button5:
                showDialog(DIALOG_4_ID);
                break;
            default:
                break;
        }
    }
の部分をDialogFragmentに変えて実装する方法が分からないのです。

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#5

投稿記事 by LL » 10年前

長くなったので分けて書かせていただきますが、
非推奨につきましては、前回立てた PreferenceActivityの非推奨問題
http://dixq.net/forum/viewtopic.php?f=3&t=15852
では、最初参考書に指定されたミニマムバージョンとターゲットバージョン(2.1:API7)で製作した時は
警告が出ず、ミニマム(2.2)ターゲット(4.4)で製作した時に警告が出ました。
しかし今回は参考書で指定されたバージョン(ミニマム、ターゲットともに2.1)で警告が出たので質問させていただきました。
参考書に書かれた通りにしても非推奨と警告が出るのは気持ち悪いので質問しました。

ISLe()

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#6

投稿記事 by ISLe() » 10年前

No.2のコードに対して、HelloDialogFragmentのコンストラクタでIDを渡し、メンバ変数を追加してそれに記憶、onCreateDialogメソッドでそのメンバ変数に記憶したIDを使ってswitch分岐、とすれば良いのではないでしょうか。

エラーについては、
dlg.show(getFragmentManager(), "tag");

dlg.show(getSupportFragmentManager() , "tag");
と変更すれば良いようです。
エラーメッセージで検索したらそのものズバリの回答が見付かりました。

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#7

投稿記事 by LL » 10年前

ISLe() さんが書きました:No.2のコードに対して、HelloDialogFragmentのコンストラクタでIDを渡し、メンバ変数を追加してそれに記憶、onCreateDialogメソッドでそのメンバ変数に記憶したIDを使ってswitch分岐、とすれば良いのではないでしょうか。

エラーについては、
dlg.show(getFragmentManager(), "tag");

dlg.show(getSupportFragmentManager() , "tag");
と変更すれば良いようです。
エラーメッセージで検索したらそのものズバリの回答が見付かりました。
http://www.united-bears.co.jp/blog/archives/160
このサイトの事ですね。

ここで指摘しているandroid.support.v4.app.FragmentActivityの API の説明
(英文)
When using this class as opposed to new platform’s built-in fragment and loader support, you must use the getSupportFragmentManager() and getSupportLoaderManager() methods respectively to access those features.
(機械翻訳)
新しいプラットフォームに組み込まれている断片とローダのサポートは、使用する必要がありますgetSupportFragmentManager()とgetSupportLoaderManager()メソッドとは対照的に、このクラスを使用する場合は、それぞれ、それらの機能にアクセスします。

翻訳してもちょっと「?」です・・・
一応修正したコードを載せます.

コード:

package jp.denpa.dialog;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;		//showDialogは高APIでは非推奨のため

public class DialogActivity extends ActionBarActivity implements View.OnClickListener{
	static final int DIALOG_HELLO_ID = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViewById(R.id.button_dialog).setOnClickListener(this);
	}
	
    public static class HelloDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(R.string.app_name);
            builder.setMessage(R.string.hello_world);
            return builder.create();
        }
    }
 
    public void onClick(View v) {
        DialogFragment dlg = new HelloDialogFragment();
        //getFragmentManager()ではなくgetSupportFragmentManager()を使用する。原因はまだ理解できていない
        dlg.show(getSupportFragmentManager(), "tag");
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.dialog, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
switch文のところはまだお待ちください・・・

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#8

投稿記事 by LL » 10年前

最初に提示したプログラムのswitch文問題は解決したので(とりあえず動いたので)
コードを掲載しておきます。
最終目的はこの前掲載したjp.denpa.alartdialogsample
をDialogFragmentで実装することなので、それが出来るまで解決はまだ保留にしておきます。
(他のプログラムと同時進行なので時間がかかるとは思いますが)

コード:

package jp.denpa.dialog;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;		//showDialogは高APIでは非推奨のため

public class DialogActivity extends ActionBarActivity implements View.OnClickListener{
	static final int DIALOG_HELLO_ID = 0;
	
	static int mDialogId=0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViewById(R.id.button_dialog).setOnClickListener(this);
	}
	
    public static class HelloDialogFragment extends DialogFragment {
    	//コンストラクタ
    	HelloDialogFragment(int id){
    		mDialogId=id;
    	}
    	
    	@Override
    	public Dialog onCreateDialog(Bundle savedInstanceState) {
    		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    		switch(mDialogId){
	    		case DIALOG_HELLO_ID:
	    			builder.setTitle(R.string.app_name);
	    			builder.setMessage(R.string.hello_world);
	    			break;
    			default:
    				break;
    		}
    		return builder.create();
    	}
    }

    public void onClick(View v) {
        DialogFragment dlg = new HelloDialogFragment(DIALOG_HELLO_ID);
        dlg.show(getSupportFragmentManager(), "tag");
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.dialog, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#9

投稿記事 by LL » 10年前

進捗ですが
もう訳が分からない事になっています・・・

コード:

package jp.denpa.alertdialogsample;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import android.support.v4.app.DialogFragment;

public class AlertDialogSampleActivity extends ActionBarActivity implements View.OnClickListener, DialogInterface.OnClickListener,
																									DialogInterface.OnMultiChoiceClickListener{

	static final int DIALOG_1_ID = 0;
	static final int DIALOG_2_ID = 1;
	static final int DIALOG_3_ID = 2;
	static final int DIALOG_4_ID = 3;
	static final int DIALOG_5_ID = 4;
	
	private static AlertDialog dialog1;
	private static AlertDialog dialog2;
	private static AlertDialog dialog3;
	private static AlertDialog dialog4;
	private static AlertDialog dialog5;
	
	private static EditText mInputText;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
		findViewById(R.id.button3).setOnClickListener(this);
		findViewById(R.id.button4).setOnClickListener(this);
		findViewById(R.id.button5).setOnClickListener(this);
		mInputText = new EditText(this);
	}

	
	public static class AlartDialogFragment extends DialogFragment{
		private int id;
		
		//コンストラクタでIDを取得する
		AlartDialogFragment(int id){
			this.id = id;
		}
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState){
			Dialog dialog;
			AlertDialog.Builder builder;
			final CharSequence items[] = {"red", "Orange", "Yellow", "Blue", "Indigo", "Violet"};
			boolean flags[]={true, false, true, false, true, false, true};
			
			switch(id){
				case DIALOG_1_ID:
					builder = new AlertDialog.Builder(AlertDialogSampleActivity.this);    //エラー
					builder.setTitle("ボタンのあるダイアログ");
					builder.setIcon(android.R.drawable.ic_dialog_alert);
					builder.setMessage("ボタンは最大3つまで表示できる");
					builder.setPositiveButton("OK", (OnClickListener) this);
					builder.setNeutralButton("キャンセル",(OnClickListener) this);
					builder.setNegativeButton("NG",(OnClickListener) this);
					dialog1 = builder.create();
					dialog = dialog1;
					break;
					
				case DIALOG_2_ID:
					builder = new AlertDialog.Builder(AlertDialogSampleActivity.this);    //エラー
					builder.setTitle("リストダイアログ");
					builder.setItems(items, (OnClickListener) this);
					builder.setNegativeButton("キャンセル", null);
					dialog2 = builder.create();
					dialog = dialog2;
					break;
					
				case DIALOG_3_ID:
					builder = new AlertDialog.Builder(AlertDialogSampleActivity.this);    //エラー
					builder.setTitle("ラジオボタンダイアログ");
					builder.setSingleChoiceItems(items, -1, (OnClickListener) this);				//単一のラジオボタンダイアログ(単一選択)
					builder.setNegativeButton("閉じる", null);
					dialog3 = builder.create();
					dialog = dialog3;	
					break;
					
				case DIALOG_4_ID:
					builder = new AlertDialog.Builder(AlertDialogSampleActivity.this);    //エラー
					builder.setTitle("チェックボックスダイアログ");
					builder.setMultiChoiceItems(items, flags, (OnMultiChoiceClickListener) this);				//複数のラジオボタンダイアログ(複数選択)
					builder.setNegativeButton("閉じる", null);
					dialog4 = builder.create();
					dialog = dialog4;	
					break;
					
				case DIALOG_5_ID:
					builder = new AlertDialog.Builder(AlertDialogSampleActivity.this);    //エラー
					builder.setTitle("カスタムダイアログ");
					builder.setView(mInputText);
					builder.setNegativeButton("閉じる", null);
					dialog5 = builder.create();
					dialog = dialog5;	
					break;
					
					default:
						dialog = null;
			}
			return dialog;
		}
	}
		
	
	//ボタンクリック時の処理:ここで処理を書かないのは画面の向きを変えたときにコールバックが壊れないようにする為・・・らしい。確信持てない
	@Override
	public void onClick(View v){
        AlartDialogFragment dlg; 

        switch(v.getId()){
        case R.id.button1:
            dlg = new AlartDialogFragment(DIALOG_1_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button2:
            dlg = new AlartDialogFragment(DIALOG_2_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button3:
            dlg = new AlartDialogFragment(DIALOG_3_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button4:
            dlg = new AlartDialogFragment(DIALOG_4_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;              
        case R.id.button5:
            dlg = new AlartDialogFragment(DIALOG_5_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        default:
            break;
        }
	}
	
	//ダイアログがタップされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int id){
		if(dialog == dialog1){
			switch(id){
				case AlertDialog.BUTTON_POSITIVE:
					Toast.makeText(this, "三番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEUTRAL:
					Toast.makeText(this, "二番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEGATIVE:
					Toast.makeText(this, "一番目のボタン", Toast.LENGTH_LONG).show();
					break;					
				default:
					break;
			}
		}else if(dialog == dialog2){
			String item = dialog2.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog3){
			String item = dialog3.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog4){
			SparseBooleanArray positions = dialog4.getListView().getCheckedItemPositions();
			StringBuffer sb = new StringBuffer();;
			for(int i=0; i<positions.size(); i++){
				if(positions.valueAt(i)){
					sb.append(dialog4.getListView().getAdapter().getItem(positions.keyAt(i)).toString()).append(" ");
				}
			}
			Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
		}
		else if(dialog == dialog5){
			Toast.makeText(this, mInputText.getText(), Toast.LENGTH_LONG).show();
		}
	}
	
	//チェックボックスダイアログがクリックされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked){
		StringBuffer sb = new StringBuffer();
		sb.append(dialog4.getListView().getAdapter().getItem(which).toString());;
		if(isChecked){
			sb.append("がチェックされました");
		}else{
			sb.append("のチェックが外されました");
		}
		Toast.makeText(this,  sb.toString(), Toast.LENGTH_LONG).show();
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.alert_dialog_sample, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
とりあえず前の通ったプログラムを参考に同じようにしてみたのですが、
エラーが出たため、このyahoo知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa ... 1288760207
を参考に修正したらまた新たに
エラーと注釈されている行で

スコープ内で型 AlertDialogSampleActivity のエンクロージング・インスタンスがアクセス不可能です

というエラーが出ます・・・


本来は別のところも滅茶苦茶にエラーが出たのですがIDEのエラー修正機能で無理やり潰したので正常に動く気がしない・・・
どうすればいいでしょうか・・・

スコープ内で型 ~~~~~~~ のエンクロージング・インスタンスがアクセス不可能です
と言うエラー自体は
http://d.hatena.ne.jp/ryoasai/201104
のサイトを参考にすると
staticクラスから非staticクラスにアクセスするのはダメということでしょうか?
頭の整理がつきません・・・

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#10

投稿記事 by LL » 10年前

(恐らく)原因が分かったので少しだけ修正しました。
その代わり、実行時にエラーが発生し強制終了するようになりました
わずかな修正コード

コード:

package jp.denpa.alertdialogsample;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import android.support.v4.app.DialogFragment;

public class AlertDialogSampleActivity extends ActionBarActivity implements View.OnClickListener, DialogInterface.OnClickListener,
																									DialogInterface.OnMultiChoiceClickListener{

	static final int DIALOG_1_ID = 0;
	static final int DIALOG_2_ID = 1;
	static final int DIALOG_3_ID = 2;
	static final int DIALOG_4_ID = 3;
	static final int DIALOG_5_ID = 4;
	
	private static AlertDialog dialog1;
	private static AlertDialog dialog2;
	private static AlertDialog dialog3;
	private static AlertDialog dialog4;
	private static AlertDialog dialog5;
	
	private static EditText mInputText;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
		findViewById(R.id.button3).setOnClickListener(this);
		findViewById(R.id.button4).setOnClickListener(this);
		findViewById(R.id.button5).setOnClickListener(this);
		mInputText = new EditText(this);
	}

	
	public static class AlartDialogFragment extends DialogFragment{
		private int id;
		
		//コンストラクタでIDを取得する
		AlartDialogFragment(int id){
			this.id = id;
		}
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState){
			Dialog dialog;
			AlertDialog.Builder builder;
			final CharSequence items[] = {"red", "Orange", "Yellow", "Blue", "Indigo", "Violet"};
			boolean flags[]={true, false, true, false, true, false, true};
			
			switch(id){
				case DIALOG_1_ID:
					builder = new AlertDialog.Builder(getActivity());     //ここはgetActivity()だったのを忘れていた。
					builder.setTitle("ボタンのあるダイアログ");
					builder.setIcon(android.R.drawable.ic_dialog_alert);
					builder.setMessage("ボタンは最大3つまで表示できる");
					builder.setPositiveButton("OK", (OnClickListener) this);		//Error
					builder.setNeutralButton("キャンセル",(OnClickListener) this);	//Error
					builder.setNegativeButton("NG",(OnClickListener) this);			//Error
					dialog1 = builder.create();
					dialog = dialog1;
					break;
					
				case DIALOG_2_ID:
					builder = new AlertDialog.Builder(getActivity());     //ここはgetActivity()だったのを忘れていた。
					builder.setTitle("リストダイアログ");
					builder.setItems(items, (OnClickListener) this);					//Error
					builder.setNegativeButton("キャンセル", null);
					dialog2 = builder.create();
					dialog = dialog2;
					break;
					
				case DIALOG_3_ID:
					builder = new AlertDialog.Builder(getActivity());    //ここはgetActivity()だったのを忘れていた。
					builder.setTitle("ラジオボタンダイアログ");
					builder.setSingleChoiceItems(items, -1, (OnClickListener) this);//Error				//単一のラジオボタンダイアログ(単一選択)
					builder.setNegativeButton("閉じる", null);
					dialog3 = builder.create();
					dialog = dialog3;	
					break;
					
				case DIALOG_4_ID:
					builder = new AlertDialog.Builder(getActivity());     //ここはgetActivity()だったのを忘れていた。
					builder.setTitle("チェックボックスダイアログ");
					builder.setMultiChoiceItems(items, flags, (OnMultiChoiceClickListener) this);//Error				//複数のラジオボタンダイアログ(複数選択)
					builder.setNegativeButton("閉じる", null);
					dialog4 = builder.create();
					dialog = dialog4;	
					break;
					
				case DIALOG_5_ID:
					builder = new AlertDialog.Builder(getActivity());     //ここはgetActivity()だったのを忘れていた。
					builder.setTitle("カスタムダイアログ");
					builder.setView(mInputText);
					builder.setNegativeButton("閉じる", null);
					dialog5 = builder.create();
					dialog = dialog5;	
					break;
					
					default:
						dialog = null;
			}
			return dialog;
		}
	}
		
	
	//ボタンクリック時の処理:ここで処理を書かないのは画面の向きを変えたときにコールバックが壊れないようにする為・・・らしい。確信持てない
	@Override
	public void onClick(View v){
        AlartDialogFragment dlg; 

        switch(v.getId()){
        case R.id.button1:
            dlg = new AlartDialogFragment(DIALOG_1_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button2:
            dlg = new AlartDialogFragment(DIALOG_2_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button3:
            dlg = new AlartDialogFragment(DIALOG_3_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button4:
            dlg = new AlartDialogFragment(DIALOG_4_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;              
        case R.id.button5:
            dlg = new AlartDialogFragment(DIALOG_5_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        default:
            break;
        }
	}
	
	//ダイアログがタップされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int id){
		if(dialog == dialog1){
			switch(id){
				case AlertDialog.BUTTON_POSITIVE:
					Toast.makeText(this, "三番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEUTRAL:
					Toast.makeText(this, "二番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEGATIVE:
					Toast.makeText(this, "一番目のボタン", Toast.LENGTH_LONG).show();
					break;					
				default:
					break;
			}
		}else if(dialog == dialog2){
			String item = dialog2.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog3){
			String item = dialog3.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog4){
			SparseBooleanArray positions = dialog4.getListView().getCheckedItemPositions();
			StringBuffer sb = new StringBuffer();;
			for(int i=0; i<positions.size(); i++){
				if(positions.valueAt(i)){
					sb.append(dialog4.getListView().getAdapter().getItem(positions.keyAt(i)).toString()).append(" ");
				}
			}
			Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
		}
		else if(dialog == dialog5){
			Toast.makeText(this, mInputText.getText(), Toast.LENGTH_LONG).show();
		}
	}
	
	//チェックボックスダイアログがクリックされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked){
		StringBuffer sb = new StringBuffer();
		sb.append(dialog4.getListView().getAdapter().getItem(which).toString());;
		if(isChecked){
			sb.append("がチェックされました");
		}else{
			sb.append("のチェックが外されました");
		}
		Toast.makeText(this,  sb.toString(), Toast.LENGTH_LONG).show();
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.alert_dialog_sample, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
エラー内容は
実際に画面に表示されているボタンを押したら
java.lang.ClassCastException: jp.denpa.alertdialogsample.AlertDialogSampleActivity$AlartDialogFragment cannot be cast to android.content.DialogInterface$OnClickListener
と言うエラーを吐いて終了。大体原因の想像がつくのですが対処方法が思いつきません・・・
その想定している原因は上記コードの//Errorと書かれているコード。
内部ではonClickListenerの情報が存在しないよということだと思っています。(まぁ親クラスにしか存在しないので必然だったでしょうが・・・)

もう一つのエラーは定数DIALOG_5_ID、カスタムダイアログの処理を実行した時のエラーで、初回は動作するのですが、2度目の実行をしようとすると
下記エラーを吐いて強制終了します。
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

こちらは原因がViewに関すること以外検討がつきません・・・

ISLe()

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#11

投稿記事 by ISLe() » 10年前

無理やりキャストしてはいけませんよ。

キャスト部分については、AlartDialogFragmentクラスの定義から51行目にあるstaticを外し、エラーの対象のthisをAlertDialogSampleActivity.thisに書き換えれば良いはずです。

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#12

投稿記事 by LL » 10年前

ISLe() さんが書きました:無理やりキャストしてはいけませんよ。

キャスト部分については、AlartDialogFragmentクラスの定義から51行目にあるstaticを外し、エラーの対象のthisをAlertDialogSampleActivity.thisに書き換えれば良いはずです。
御返答ありがとうございます。
ですが、下記サイト
http://bkiwad.wordpress.com/2011/05/10/ ... -fragment/
を参考にしますと、Fragmentを継承したクラスはstaticでないといけないので(実際にご指摘どおりに致しましたら、動きはしましたが、該当ボタンを押しても何の反応も(LogCatエラーすら)ありませんでした。)この方法はダメでした。

ISLe()

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#13

投稿記事 by ISLe() » 10年前

No.10のひとつ目の問題は、
getActivity()の戻り値をAlertDialogSampleActivityにキャストすれば通ると思います。
安全性に不安は残りますが。
具体的には、該当の、
this

(AlertDialogSampleActivity)getActivity()
に置き換えます。

No.10のふたつ目の問題は、既にビューにセットされているEditTextを別のビューにセットしようとして発生していると思われます。
ダイアログの生成とともに、その都度EditTextのインスタンスの生成を行えば良いと思います。
具体的には47行目のコードを、105行目と106行目のあいだに移します。


あくまでも、とりあえず動くことを優先するものです。

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#14

投稿記事 by LL » 10年前

ISLeさんのご指摘どおりに二つの修正をしましたが、症状は改善できませんでした・・・
とりあえず進捗としてコードを提出します。

コード:

package jp.denpa.alertdialogsample;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import android.support.v4.app.DialogFragment;

public class AlertDialogSampleActivity extends ActionBarActivity implements View.OnClickListener, DialogInterface.OnClickListener,
																									DialogInterface.OnMultiChoiceClickListener{

	static final int DIALOG_1_ID = 0;
	static final int DIALOG_2_ID = 1;
	static final int DIALOG_3_ID = 2;
	static final int DIALOG_4_ID = 3;
	static final int DIALOG_5_ID = 4;
	
	private static AlertDialog dialog1;
	private static AlertDialog dialog2;
	private static AlertDialog dialog3;
	private static AlertDialog dialog4;
	private static AlertDialog dialog5;
	
	private static EditText mInputText;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	
	public class AlartDialogFragment extends DialogFragment{
		private int id;
		
		//コンストラクタでIDを取得する
		AlartDialogFragment(int id){
			this.id = id;
		}
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState){
			Dialog dialog;
			AlertDialog.Builder builder;
			final CharSequence items[] = {"red", "Orange", "Yellow", "Blue", "Indigo", "Violet"};
			boolean flags[]={true, false, true, false, true, false, true};
			
			switch(id){
				case DIALOG_1_ID:
					builder = new AlertDialog.Builder((AlertDialogSampleActivity)getActivity());    //ここもキャストしてみたがダメだった・・・
					builder.setTitle("ボタンのあるダイアログ");
					builder.setIcon(android.R.drawable.ic_dialog_alert);
					builder.setMessage("ボタンは最大3つまで表示できる");
					builder.setPositiveButton("OK", (AlertDialogSampleActivity)getActivity());		//Error
					builder.setNeutralButton("キャンセル", (AlertDialogSampleActivity)getActivity());	//Error
					builder.setNegativeButton("NG",(AlertDialogSampleActivity)getActivity());			//Error
					dialog1 = builder.create();
					dialog = dialog1;
					break;
					
				case DIALOG_2_ID:
					builder = new AlertDialog.Builder((AlertDialogSampleActivity)getActivity());
					builder.setTitle("リストダイアログ");
					builder.setItems(items, (AlertDialogSampleActivity)getActivity());					//Error
					builder.setNegativeButton("キャンセル", null);
					dialog2 = builder.create();
					dialog = dialog2;
					break;
					
				case DIALOG_3_ID:
					builder = new AlertDialog.Builder((AlertDialogSampleActivity)getActivity());
					builder.setTitle("ラジオボタンダイアログ");
					builder.setSingleChoiceItems(items, -1, (AlertDialogSampleActivity)getActivity());//Error				//単一のラジオボタンダイアログ(単一選択)
					builder.setNegativeButton("閉じる", null);
					dialog3 = builder.create();
					dialog = dialog3;	
					break;
					
				case DIALOG_4_ID:
					builder = new AlertDialog.Builder((AlertDialogSampleActivity)getActivity());
					builder.setTitle("チェックボックスダイアログ");
					builder.setMultiChoiceItems(items, flags, (AlertDialogSampleActivity)getActivity());//Error				//複数のラジオボタンダイアログ(複数選択)
					builder.setNegativeButton("閉じる", null);
					dialog4 = builder.create();
					dialog = dialog4;	
					break;
					
				case DIALOG_5_ID:
					mInputText = new EditText((AlertDialogSampleActivity)getActivity());
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("カスタムダイアログ");
					builder.setView(mInputText);
					builder.setNegativeButton("閉じる", null);
					dialog5 = builder.create();
					dialog = dialog5;	
					break;
					
					default:
						dialog = null;
			}
			return dialog;
		}
	}
		
	
	//ボタンクリック時の処理:ここで処理を書かないのは画面の向きを変えたときにコールバックが壊れないようにする為・・・らしい。確信持てない
	@Override
	public void onClick(View v){
        AlartDialogFragment dlg; 

        switch(v.getId()){
        case R.id.button1:
            dlg = new AlartDialogFragment(DIALOG_1_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button2:
            dlg = new AlartDialogFragment(DIALOG_2_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button3:
            dlg = new AlartDialogFragment(DIALOG_3_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button4:
            dlg = new AlartDialogFragment(DIALOG_4_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;              
        case R.id.button5:
            dlg = new AlartDialogFragment(DIALOG_5_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        default:
            break;
        }
	}
	
	//ダイアログがタップされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int id){
		if(dialog == dialog1){
			switch(id){
				case AlertDialog.BUTTON_POSITIVE:
					Toast.makeText(this, "三番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEUTRAL:
					Toast.makeText(this, "二番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEGATIVE:
					Toast.makeText(this, "一番目のボタン", Toast.LENGTH_LONG).show();
					break;					
				default:
					break;
			}
		}else if(dialog == dialog2){
			String item = dialog2.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog3){
			String item = dialog3.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog4){
			SparseBooleanArray positions = dialog4.getListView().getCheckedItemPositions();
			StringBuffer sb = new StringBuffer();;
			for(int i=0; i<positions.size(); i++){
				if(positions.valueAt(i)){
					sb.append(dialog4.getListView().getAdapter().getItem(positions.keyAt(i)).toString()).append(" ");
				}
			}
			Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
		}
		else if(dialog == dialog5){
			Toast.makeText(this, mInputText.getText(), Toast.LENGTH_LONG).show();
		}
	}
	
	//チェックボックスダイアログがクリックされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked){
		StringBuffer sb = new StringBuffer();
		sb.append(dialog4.getListView().getAdapter().getItem(which).toString());;
		if(isChecked){
			sb.append("がチェックされました");
		}else{
			sb.append("のチェックが外されました");
		}
		Toast.makeText(this,  sb.toString(), Toast.LENGTH_LONG).show();
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.alert_dialog_sample, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}


ISLe()

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#16

投稿記事 by ISLe() » 10年前

#キャストする必要ないところまで変更されてる…

LL

Re: android.app.Dialog__showDialogメソッドの推奨に対して[java android]

#17

投稿記事 by LL » 10年前

ISLe() さんが書きました:#キャストする必要ないところまで変更されてる…
大変忙しい中での御返答ありがとうございます。
関係ない所へ変更は最初、仰られた通りに直しても動かなかったために試しにと変更したものです。
修正するのを忘れてあげてしまった為に誤解を生んでしまったことをお詫び申し上げます。
そして肝心の本題ですが、原因が分かりました。

メインActivityのonCreate内に記述されていたはずのfindViewByIdを修正の際、間違えてごっそり消してしまったようで、
そのせいでボタンを押しても何も反応を起こさなかった模様です。
至極初心的で致命的な阿呆らしいミスでした・・・
修正後のコードです。

コード:

package jp.denpa.alertdialogsample;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import android.support.v4.app.DialogFragment;

public class AlertDialogSampleActivity extends ActionBarActivity implements View.OnClickListener, DialogInterface.OnClickListener,
																									DialogInterface.OnMultiChoiceClickListener{

	static final int DIALOG_1_ID = 0;
	static final int DIALOG_2_ID = 1;
	static final int DIALOG_3_ID = 2;
	static final int DIALOG_4_ID = 3;
	static final int DIALOG_5_ID = 4;
	
	private static AlertDialog dialog1;
	private static AlertDialog dialog2;
	private static AlertDialog dialog3;
	private static AlertDialog dialog4;
	private static AlertDialog dialog5;
	
	private static EditText mInputText;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
		findViewById(R.id.button3).setOnClickListener(this);
		findViewById(R.id.button4).setOnClickListener(this);
		findViewById(R.id.button5).setOnClickListener(this);
	}

	
	public static class AlartDialogFragment extends DialogFragment{
		private int id;
		
		//コンストラクタでIDを取得する
		AlartDialogFragment(int id){
			this.id = id;
		}
		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState){
			Dialog dialog;
			AlertDialog.Builder builder;
			final CharSequence items[] = {"red", "Orange", "Yellow", "Blue", "Indigo", "Violet"};
			boolean flags[]={true, false, true, false, true, false, true};
			
			switch(id){
				case DIALOG_1_ID:
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("ボタンのあるダイアログ");
					builder.setIcon(android.R.drawable.ic_dialog_alert);
					builder.setMessage("ボタンは最大3つまで表示できる");
					builder.setPositiveButton("OK", (AlertDialogSampleActivity)getActivity());		
					builder.setNeutralButton("キャンセル", (AlertDialogSampleActivity)getActivity());	
					builder.setNegativeButton("NG",(AlertDialogSampleActivity)getActivity());			
					dialog1 = builder.create();
					dialog = dialog1;
					break;
					
				case DIALOG_2_ID:
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("リストダイアログ");
					builder.setItems(items, (AlertDialogSampleActivity)getActivity());					
					builder.setNegativeButton("キャンセル", null);
					dialog2 = builder.create();
					dialog = dialog2;
					break;
					
				case DIALOG_3_ID:
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("ラジオボタンダイアログ");
					builder.setSingleChoiceItems(items, -1, (AlertDialogSampleActivity)getActivity());//Error				//単一のラジオボタンダイアログ(単一選択)
					builder.setNegativeButton("閉じる", null);
					dialog3 = builder.create();
					dialog = dialog3;	
					break;
					
				case DIALOG_4_ID:
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("チェックボックスダイアログ");
					builder.setMultiChoiceItems(items, flags, (AlertDialogSampleActivity)getActivity());//Error				//複数のラジオボタンダイアログ(複数選択)
					builder.setNegativeButton("閉じる", null);
					dialog4 = builder.create();
					dialog = dialog4;	
					break;
					
				case DIALOG_5_ID:
					mInputText = new EditText(getActivity());
					builder = new AlertDialog.Builder(getActivity());
					builder.setTitle("カスタムダイアログ");
					builder.setView(mInputText);
					builder.setNegativeButton("閉じる", null);
					dialog5 = builder.create();
					dialog = dialog5;	
					break;
					
					default:
						dialog = null;
			}
			return dialog;
		}
	}
		
	
	//ボタンクリック時の処理:ここで処理を書かないのは画面の向きを変えたときにコールバックが壊れないようにする為・・・らしい。確信持てない
	@Override
	public void onClick(View v){
        AlartDialogFragment dlg; 

        switch(v.getId()){
        case R.id.button1:
            dlg = new AlartDialogFragment(DIALOG_1_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button2:
            dlg = new AlartDialogFragment(DIALOG_2_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button3:
            dlg = new AlartDialogFragment(DIALOG_3_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        case R.id.button4:
            dlg = new AlartDialogFragment(DIALOG_4_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;              
        case R.id.button5:
            dlg = new AlartDialogFragment(DIALOG_5_ID);
            dlg.show(getSupportFragmentManager(), "tag");
            break;
        default:
            break;
        }
	}
	
	//ダイアログがタップされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int id){
		if(dialog == dialog1){
			switch(id){
				case AlertDialog.BUTTON_POSITIVE:
					Toast.makeText(this, "三番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEUTRAL:
					Toast.makeText(this, "二番目のボタン", Toast.LENGTH_LONG).show();
					break;
				case AlertDialog.BUTTON_NEGATIVE:
					Toast.makeText(this, "一番目のボタン", Toast.LENGTH_LONG).show();
					break;					
				default:
					break;
			}
		}else if(dialog == dialog2){
			String item = dialog2.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog3){
			String item = dialog3.getListView().getAdapter().getItem(id).toString();
			Toast.makeText(this, item, Toast.LENGTH_LONG).show();
		}else if(dialog == dialog4){
			SparseBooleanArray positions = dialog4.getListView().getCheckedItemPositions();
			StringBuffer sb = new StringBuffer();;
			for(int i=0; i<positions.size(); i++){
				if(positions.valueAt(i)){
					sb.append(dialog4.getListView().getAdapter().getItem(positions.keyAt(i)).toString()).append(" ");
				}
			}
			Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
		}
		else if(dialog == dialog5){
			Toast.makeText(this, mInputText.getText(), Toast.LENGTH_LONG).show();
		}
	}
	
	//チェックボックスダイアログがクリックされたときに呼ばれる
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked){
		StringBuffer sb = new StringBuffer();
		sb.append(dialog4.getListView().getAdapter().getItem(which).toString());;
		if(isChecked){
			sb.append("がチェックされました");
		}else{
			sb.append("のチェックが外されました");
		}
		Toast.makeText(this,  sb.toString(), Toast.LENGTH_LONG).show();
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.alert_dialog_sample, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
findViewByIdのミスに気がついたときは朝っぱらから放心状態でした・・・
ですがちゃんと動いたので今回は解決にチェックをいれさせていただきたいと思います。
(まだ安全性に問題があるとのことですが今の自分ではこのコードを把握するために脳のリソースを割くのが精一杯です・・・)

閉鎖

“C言語何でも質問掲示板” へ戻る