this questionの補数です。preferences.xmlからアクティビティを開始し、onActivityResultで結果を取得してください
私はアクティビティを開始することができますが、結果を得ることもできる必要があります。どうすればいいのですか?
私のPreferencesActivityでonActivityResultを無効にしてみました。
preferences.xmlにいくつかの追加のプロパティがありませんか?
this questionの補数です。preferences.xmlからアクティビティを開始し、onActivityResultで結果を取得してください
私はアクティビティを開始することができますが、結果を得ることもできる必要があります。どうすればいいのですか?
私のPreferencesActivityでonActivityResultを無効にしてみました。
preferences.xmlにいくつかの追加のプロパティがありませんか?
あなたはあなたのメインの活動での使用にこのコード好みの活動からのデータを渡す場合:お好みのアクティビティクラスで
startActivityForResult(new Intent(main.this, preferences.class), 0);
:あなたのメインアクティビティクラス(打ち上げ)では
を(結果セット):
Intent i;
i.putStringExtra("name", "tom");
setResult(RESULT_OK, i);
finish();
でメインアクティビティクラス(結果を得る):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == RESULT_OK){
Log.d("test", data.getExtraString("name");
}
}
}
あなたが望む限り多くのエキストラを入れて、文字列が、すべての標準データ型だけでなく、することができます。私は右のすべてをした
希望; Kaarelは私に言ったとおり)
EDITは
は、私はおそらく質問をmissunderstood。データあなたの好みの活動で
String foo = "hello";
Intent i = new Intent();
i.putExtra("testString", foo);//You can also add other types of variables here, see [1] for reference
i.setClass(main.this, preferences.class);
startActivity(i);
好みのアクティビティを起動し、添付:あなたのメインの活動で
: これは好みの活動のメインactiviyからデータを受け取ることができる方法であるレシーブ意図
Bundle b = this.getIntent().getExtras();//[2]
if (b!=null){
String recievedString = b.getString("testString");
//The recievedString variable contains the String "hello" now, see [3]
}
[1] https://developer.android.com/reference/android/content/Intent.html
に添付されたデータ[2] https://developer.android.com/reference/android/content/Intent.html#getExtras%28%29
[3] https://developer.android.com/reference/android/os/Bundle.html
あなたは、OPが尋ねた質問に答えていません。問題は、プリファレンス・アクティビティーから起動されたインテントの結果を処理する方法です。つまり、 'onActivityResult'は' PreferencesActivity'になければなりません。 – Kaarel
Mhあなたは正しいと思います回答を編集します – MazeChaZer
あなたはまだ間違った質問に答えています... :( – Kaarel
私はの好みのクリックに耳を傾け、明示的意図を起動することです知っているクリーンなソリューション。このようにしてonActivityResult
が通常どおり呼び出されます。
Preference pref = (Preference) findPreference("prefKey");
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivityForResult(preference.getIntent(), 1234);
return true;
}
});
があなたのPreferencesActivityクラスでstartActivity()
をオーバーライドしてみてます
(1234
がonActivityResult
のための要求コードがどこにあるか)あなたはこのようにそれにリスナーを添付することができ、あなたの目的、好みはXMLで定義されていると仮定すると、
public class PreferencesActivity {
// ...
@Override
public void startActivity(Intent intent) {
if (thisIsTheExpected(intent)) {
super.startActivityForResult(intent, 1234);
} else {
super.startActivity(intent);
}
}
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data) {
if (reqCode == 1234) {
// should be getting called now
}
}
// ...
}
によって:それは代わりに、意図は、我々は(要求コードとして1234で)次のような、に興味がある一つであることを確認した後startActivityForResult()
を呼び出しますあなたのニーズに、これはあなたのコード内のいくつかのOnPreferenceClickListener
を追加することに比べて簡単である可能性:)
私は、それが 'startActivity(Intent)'がプリファレンス項目がクリックされたときに常に呼び出されるという前提を作るので、それが(Androidの将来のバージョンで)壊れるかもしれないと心配しています。したがって、プリファレンスキーとの照合よりエラーが発生しやすくなりますので、当分の間は私の解決策を検討します。 – Kaarel
あなたが行1000年で、プラットフォームのソースコードhereにPreferenceActivity.javaを見てみる場合は、あなたの意図はstartActivity startActivity(header.intent);
経由で呼び出されていることがわかりますstartActivityForResultではなく、これが可能だと私は考えていません。
ただし、onHeaderClick
関数と、PreferenceActivityのonActivityResult
関数をオーバーライドして、何が起こるかを確認できます。私は自分でそれを試していないので、私は知らないし、将来のバージョンでこのアプローチが壊れる可能性が高いです。
しかし、おそらくあなたのために働く別のアプローチがあります。参照の質問からわかるように、あなたは意図を介して活動を開始しています。このアクティビティが設定を編集するためのものであれば、これは正しいアプローチではありません。アンドロイドはアクティビティを開始するためだけにこのインテントを使用します。私の意見では、それをカスタマイズするために利用可能なものを拡張することによって、あなたの特定の嗜好アクティビティを作成する方が良いです。私は、このアプローチを使用することにより
<PreferenceScreen android:key="connection_screen"
android:title="@string/wpref_Connection_Screen_title"
android:summary="@string/wpref_Connection_Screen_summary"
android:shouldDisableView="true">
<com.test.app.CustomSelectAppPreference android:key="userSelectedApplication"
android:title="@string/wpref_userSelectedApplication_title"
android:summary="@string/wpref_userSelectedApplication_summary"
android:dialogTitle="@string/userselectedApplication_dialogTitle"
android:entries="@array/selectedapps_dummy_actions"
android:entryValues="@array/selectedapps_dummy_actionsvalues"
android:defaultValue=""
android:shouldDisableView="true"/>
</PreferenceScreen>
を:ここで私は、ユーザーがアプリケーションを選択させるために使用私のカスタマイズしたListPreferenceです:
public class CustomSelectAppPreference extends ListPreference {
//----- Constructor -----
public CustomSelectAppPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
//----- Constructor END -----
//----- Public Code -----
public void SetResult(String packageName) {
if(this.callChangeListener(packageName)) {
Editor edit = this.getSharedPreferences().edit();
edit.putString(this.getKey(), packageName);
edit.commit();
}
this.getDialog().dismiss();
}
//----- Public Code END -----
//----- ListPreference Overrides -----
@Override
protected void onPrepareDialogBuilder(Builder builder) {
Log.d("CustomSelectAppPreference", "onPrepareDialogBuilder");
super.onPrepareDialogBuilder(builder);
String selectedPackage = this.getSharedPreferences().getString(this.getKey(), "");
ListAdapter listAdapter = (ListAdapter) new ApplicationsArrayAdapter(this.getContext(), Utilities.getInstalledApplications(this.getContext(), selectedPackage), this);
builder.setAdapter(listAdapter, this);
}
//----- ListPreference Overrides END -----
}
は、私はこのように私のあるpreferences.xmlでそれを使用しています私のユーザーがこのアクティビティで行うすべてのことを、アンドロイドの好みに関するルールを破ることなくコントロールできます。
これが役に立ちます。
可能な重複:http://stackoverflow.com/q/3385075/291827 –