2012-03-03 13 views
16

this questionの補数です。preferences.xmlからアクティビティを開始し、onActivityResultで結果を取得してください

私はアクティビティを開始することができますが、結果を得ることもできる必要があります。どうすればいいのですか?

私のPreferencesActivityでonActivityResultを無効にしてみました。

preferences.xmlにいくつかの追加のプロパティがありませんか?

+1

可能な重複:http://stackoverflow.com/q/3385075/291827 –

答えて

3

あなたはあなたのメインの活動での使用にこのコード好みの活動からのデータを渡す場合:お好みのアクティビティクラスで

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

+0

あなたは、OPが尋ねた質問に答えていません。問題は、プリファレンス・アクティビティーから起動されたインテントの結果を処理する方法です。つまり、 'onActivityResult'は' PreferencesActivity'になければなりません。 – Kaarel

+0

Mhあなたは正しいと思います回答を編集します – MazeChaZer

+0

あなたはまだ間違った質問に答えています... :( – Kaarel

17

私はの好みのクリックに耳を傾け、明示的意図を起動することです知っているクリーンなソリューション。このようにしてonActivityResultが通常どおり呼び出されます。

Preference pref = (Preference) findPreference("prefKey"); 
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
    @Override 
    public boolean onPreferenceClick(Preference preference) { 
    startActivityForResult(preference.getIntent(), 1234); 
    return true; 
    } 
}); 
13

があなたのPreferencesActivityクラスでstartActivity()をオーバーライドしてみてます

1234onActivityResultのための要求コードがどこにあるか)あなたはこのようにそれにリスナーを添付することができ、あなたの目的、好みは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を追加することに比べて簡単である可能性:)

+0

私は、それが 'startActivity(Intent)'がプリファレンス項目がクリックされたときに常に呼び出されるという前提を作るので、それが(Androidの将来のバージョンで)壊れるかもしれないと心配しています。したがって、プリファレンスキーとの照合よりエラーが発生しやすくなりますので、当分の間は私の解決策を検討します。 – Kaarel

1

あなたが行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でそれを使用しています私のユーザーがこのアクティビティで行うすべてのことを、アンドロイドの好みに関するルールを破ることなくコントロールできます。

これが役に立ちます。

関連する問題