2012-03-03 20 views
16

यह this question का पूरक है।प्राथमिकता.एक्सएमएल से प्रारंभ गतिविधि और परिणाम प्राप्त करें सक्रियता Result

मैं गतिविधि लॉन्च कर सकता हूं लेकिन मुझे परिणाम प्राप्त करने में भी सक्षम होना चाहिए। मैं यह कैसे करुं?

मैंने अपनी प्राथमिकताएं सक्रियता पर एक्टिविटी रिसेट पर ओवरराइड करने का प्रयास नहीं किया।

क्या मुझे प्राथमिकताओं.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 मुझसे कहा, मैं शायद सवाल 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 से डेटा प्राप्त कैसे कर सकते हैं recieve डेटा आशय

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

आप ओपी से पूछे गए प्रश्न का उत्तर नहीं दे रहे हैं। सवाल यह था कि प्राथमिकता गतिविधि से लॉन्च किए गए इरादे के परिणाम को कैसे संसाधित करना है, यानी 'ऑनएक्टिविटी रिसेट' को 'प्राथमिकताएं' में होना चाहिए। – Kaarel

+0

एमएच मुझे लगता है कि आप सही हैं मैं जवाब – MazeChaZer

+0

संपादित करूँगा, मुझे लगता है कि आप अभी भी गलत सवाल का जवाब दे रहे हैं ... :( – Kaarel

17

साफ समाधान मुझे पता है कि की पसंद पर क्लिक करने के लिए सुनो और स्पष्ट रूप से आशय शुरू करने के लिए है। इस प्रकार onActivityResult सामान्य के रूप में बुलाया जाएगा।

यह मानते हुए कि आपका मंतव्य-वरीयता एक्सएमएल में परिभाषित किया गया है आप इस तरह यह करने के लिए एक श्रोता संलग्न कर सकते हैं (जहां 1234onActivityResult के लिए एक अनुरोध कोड है):

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() अधिभावी की कोशिश करो और बनाने यह startActivityForResult() फोन के बजाय यह जांच करना कि इरादे से एक हम (अनुरोध कोड के रूप में 1234 के साथ) निम्नलिखित के लिए, में रुचि रखते समान हैं के बाद:

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 
     } 
    } 

    // ... 
} 

निर्भर करता है अपनी आवश्यकताओं पर, इस की तुलना में सरल हो सकता है जोड़ने कई OnPreferenceClickListener अपने कोड :)

+0

अच्छा विचार, हालांकि मुझे चिंता है कि यह टूट सकता है (एंड्रॉइड के भविष्य के संस्करण में) क्योंकि यह धारणा है कि 'प्राथमिकता (इरादा)' हमेशा वरीयता आइटम पर क्लिक होने पर कॉल किया जाता है। इसके अलावा 'यह अनुमानित (इरादा)' कम सीधे-आगे लगता है और इस तरह एक वरीयता कुंजी के खिलाफ मिलान करने से अधिक त्रुटि-प्रवण। इसलिए समय के लिए मैं अपने समाधान के साथ जा रहा हूं। – Kaarel

1

आप लाइन 1000 में मंच स्रोत कोड here में PreferenceActivity.java पर एक नज़र डालें तो आप देख सकते हैं कि आपके इरादे startActivity startActivity(header.intent); के माध्यम से कहा जाता है में और startActivityForResult के माध्यम से नहीं, इसलिए मुझे नहीं लगता कि यह संभव है।

हालांकि आप onHeaderClick फ़ंक्शन को प्राथमिकता के onActivityResult के साथ ओवरराइड करने का प्रयास कर सकते हैं और देखें कि क्या होता है। मैंने इसे स्वयं नहीं किया, इसलिए मुझे नहीं पता और एक अच्छा मौका है कि यह दृष्टिकोण भविष्य के संस्करणों में टूट जाएगा।

लेकिन शायद एक और दृष्टिकोण है जो आपके लिए काम कर सकता है। जैसा कि मैं आपके संदर्भ प्रश्न से देख सकता हूं, आप एक इरादे के माध्यम से एक गतिविधि शुरू कर रहे हैं। यदि यह गतिविधि सेटिंग्स संपादन के लिए है तो यह सही दृष्टिकोण नहीं है क्योंकि एंड्रॉइड सिर्फ इस गतिविधि को लॉन्च करने के लिए इस इरादे का उपयोग करता है और कुछ भी नहीं। मेरी राय में इसे अनुकूलित करने के लिए किसी भी उपलब्ध लोगों को विस्तारित करके अपनी विशिष्ट वरीयता गतिविधि बनाना बेहतर है। यहाँ मेरी अनुकूलित 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 में यह उपयोग कर रहा हूँ:

<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> 

इस दृष्टिकोण मैं का उपयोग करके वरीयताओं के बारे में एंड्रॉइड के नियमों को तोड़ने के बिना मेरे उपयोगकर्ता द्वारा इस गतिविधि में सबकुछ नियंत्रित कर सकता है।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे