एक गतिविधि से पिछली गतिविधि तक मूल्यों को कैसे पारित किया जाए


99

मैं एक स्क्रीन से इसकी पिछली स्क्रीन पर कोई मान कैसे पास करूं?

इस मामले पर विचार करें: मेरे पास दो गतिविधियाँ हैं। पहली स्क्रीन में एक TextViewऔर एक बटन है और दूसरी गतिविधि में एक EditTextऔर एक बटन है।

अगर मैं पहला बटन क्लिक करता हूं तो उसे दूसरी गतिविधि में जाना होगा और यहां उपयोगकर्ता को टेक्स्ट बॉक्स में कुछ लिखना होगा। यदि वह दूसरी स्क्रीन से बटन दबाता है तो टेक्स्ट बॉक्स से मान पहली गतिविधि में जाना चाहिए और उसे पहली गतिविधि में प्रदर्शित किया जाना चाहिए TextView



जवाबों:


244

एक गतिविधि पर किए गए कार्यों को दूसरे के भीतर करने के लिए तीन चरणों की आवश्यकता होती है।

startActivityForResultअपनी मुख्य गतिविधि का उपयोग करके माध्यमिक गतिविधि (अपने 'संपादित पाठ' गतिविधि) को एक सक्रियता के रूप में लॉन्च करें।

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

किसी उपयोगकर्ता द्वारा बटन क्लिक करने पर गतिविधि को बंद करने के बजाय, सबटक्टिविटी के भीतर, आपको एक नया इंटेंट बनाने और उसके एक्स्ट्रा बंडल में दर्ज टेक्स्ट मान को शामिल करने की आवश्यकता है। सेकेंडरी एक्टिविटी को बंद करने के लिए setResultकॉल finishकरने से पहले इसे पेरेंट कॉल पर वापस भेज दें ।

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

अंतिम चरण कॉलिंग गतिविधि में है: onActivityResultपाठ प्रविष्टि गतिविधि से कॉलबैक के लिए सुनने के लिए ओवरराइड करें । आपके द्वारा प्रदर्शित पाठ मूल्य प्राप्त करने के लिए दिए गए इरादे से अतिरिक्त प्राप्त करें।

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 

27
यह सब मेरे लिए काम करता है सिवाय new Intent(null);"बहुत अस्पष्ट" और मुझे इसे बदलना पड़ा new Intent();
रिचर्ड टिंगल

1
यह भी ध्यान देने योग्य है कि यह केवल उसी संदर्भ में काम करेगा। यदि आप गतिविधि को उदाहरण के लिए एक टुकड़े से शुरू करते हैं, तो यह काम नहीं करेगा क्योंकि अनुरोध प्रत्येक बार अलग-अलग होगा। आपको अंश में getActivity ()। StartActivityForResult () का उपयोग करने की आवश्यकता होगी।
स्टेफ

10

ऐसे कुछ तरीके हैं जिनके द्वारा आप अन्य वर्गों या गतिविधि में चर या ऑब्जेक्ट तक पहुंच सकते हैं।

ए। डेटाबेस

B. साझा प्राथमिकताएँ।

सी। वस्तु क्रमांकन।

डी। एक वर्ग जो सामान्य डेटा को धारण कर सकता है, उसे आम उपयोगिताओं के रूप में नामित किया जा सकता है जो आप पर निर्भर करता है।

ई। इंटेंस और पार्सलेबल इंटरफेस के माध्यम से डेटा पास करना।

यह आपकी परियोजना की जरूरतों पर निर्भर करता है।

ए। डेटाबेस

SQLite एक Open Source Database है जो Android में एम्बेडेड है। SQLite, SQL सिंटैक्स, लेन-देन और तैयार कथनों जैसे मानक रिलेशनल डेटाबेस सुविधाओं का समर्थन करता है।

ट्यूटोरियल - http://www.vogella.com/articles/AndroidSQLite/article.html

B. साझा प्राथमिकताएँ

मान लीजिए कि आप उपयोगकर्ता नाम संग्रहीत करना चाहते हैं। तो अब दो चीज़ होगी एक Key Username, Value Value।

कैसे स्टोर करें

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

PutString (), putBoolean (), putInt (), putFloat (), putLong () का उपयोग करके आप अपने इच्छित dtatype को बचा सकते हैं।

कैसे लायें

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

सी। वस्तु क्रमांकन

यदि हम ऑब्जेक्ट स्टेट को नेटवर्क पर भेजने के लिए सहेजना चाहते हैं तो ऑब्जेक्ट सेर्लाइज़ेशन का उपयोग किया जाता है या आप इसे अपने उद्देश्य के लिए भी उपयोग कर सकते हैं।

जावा बीन्स का उपयोग करें और अपने खेतों में से एक के रूप में स्टोर करें और उसके लिए गेटर्स और सेटर का उपयोग करें

JavaBeans जावा क्लासेस हैं जिनके गुण हैं। गुणों को निजी उदाहरण चर के रूप में सोचें। चूंकि वे निजी हैं, इसलिए उनकी कक्षा के बाहर पहुंचने का एकमात्र तरीका कक्षा में विधियों के माध्यम से है। किसी संपत्ति के मूल्य को बदलने वाले तरीकों को सेटर विधि कहा जाता है, और संपत्ति के मूल्य को पुनः प्राप्त करने वाले तरीकों को गेट्टर तरीके कहा जाता है।

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

आप का उपयोग करके मेल विधि में चर सेट करें

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

फिर इस ऑब्जेक्ट को सीरियल करने के लिए ऑब्जेक्ट सीरियल का उपयोग करें और अपने अन्य वर्ग में इस ऑब्जेक्ट को डिसेरलाइज़ करें।

क्रमांकन में किसी ऑब्जेक्ट को बाइट्स के अनुक्रम के रूप में दर्शाया जा सकता है जिसमें ऑब्जेक्ट के डेटा के साथ-साथ ऑब्जेक्ट के प्रकार और ऑब्जेक्ट में संग्रहीत डेटा के प्रकार के बारे में जानकारी शामिल होती है।

किसी सीरियल किए गए ऑब्जेक्ट को किसी फ़ाइल में लिखे जाने के बाद, इसे फ़ाइल से पढ़ा जा सकता है और डीसर्विलाइज़ किया जा सकता है, जो कि सूचना और बाइट्स जो ऑब्जेक्ट का प्रतिनिधित्व करता है और इसके डेटा का उपयोग मेमोरी में ऑब्जेक्ट को फिर से बनाने के लिए किया जा सकता है।

यदि आप इसके लिए ट्यूटोरियल चाहते हैं तो इस लिंक को देखें

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

अन्य वर्गों में परिवर्तनशील हो

डी। आम उपयोगिताएँ

आप अपने स्वयं के द्वारा एक वर्ग बना सकते हैं जिसमें आम डेटा हो सकता है जिसकी आपको अपने प्रोजेक्ट में अक्सर आवश्यकता होती है।

नमूना

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

इंटों के माध्यम सेपासिंग डेटा

डेटा पास करने के इस विकल्प के लिए कृपया इस ट्यूटोरियल को देखें।

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


6

आपके पास नहीं है ...

बस दूसरी गतिविधि से newIntent () को कॉल करें

Intent retData=new Intent();

वापस पास करने के लिए डेटा जोड़ें

putExtras (retData.putExtra("userName", getUsrName()));

SetResult के साथ आगे बढ़ें

setResult(RESULT_OK, retData);

और फिर खत्म कर सकते हैं

finish();


2

मैं अक्सर उन्हें सेट करने के लिए स्थिर सेटर विधियों के साथ कॉलिंग गतिविधि में स्थिर चर का उपयोग करता हूं।

इस तरह मैं विभिन्न गतिविधियों के बीच नियंत्रण के सटीक प्रवाह की परवाह किए बिना, किसी भी गतिविधि में मूल्यों को बदल सकता हूं।

ध्यान दें कि इस तरकीब का उपयोग केवल तभी किया जा सकता है जब आप आवेदन में एक ही गतिविधि (वर्ग) की एक से अधिक प्रतियों के तात्कालिकता की परवाह नहीं करते हैं, फिर भी मुझे यह लागू करने में सबसे आसान लगता है, और मैं इसका सबसे अधिक उपयोग करता हूं ।


एक महान समाधान नहीं। यह एंड्रॉइड के सर्वश्रेष्ठ अभ्यास के खिलाफ जा रहा है। आप इस बात की गारंटी नहीं दे सकते कि कोई गतिविधि मारी नहीं जा रही है और सिस्टम द्वारा एक नया उदाहरण शुरू किया गया है।
SIr कोडिलाट

0

यहाँ करने का सबसे अच्छा तरीका चर को एक सामान्य वर्ग में लाना है जिसे दायरे से बाहर परिभाषित किया गया है

public class Utils 
{
    public static String mPosition;
}

अपने कोड के अंदर (जैसे OnButtonClick आदि ...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

के कोड के अंदर

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == activity.RESES_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.