Android में मुख्य गतिविधि पर वापस डेटा भेजना


295

मेरे पास दो गतिविधियाँ हैं: मुख्य गतिविधि और बाल गतिविधि।
जब मैं मुख्य गतिविधि में एक बटन दबाता हूं, तो बाल गतिविधि शुरू की जाती है।

अब मैं कुछ डेटा वापस मुख्य स्क्रीन पर भेजना चाहता हूं। मैंने बंड क्लास का इस्तेमाल किया, लेकिन यह काम नहीं कर रहा है। यह कुछ क्रम अपवादों को फेंकता है।

क्या इसका कोई समाधान है?



एक और तरकीब आपकी मुख्य गतिविधि में एक ArrayList को परिभाषित करती है और इसे स्थिर बनाती है ताकि आप इसे दूसरी गतिविधि में एक्सेस कर सकें। इसके बाद इसमें जो डेटा आप मुख्य गतिविधि को भेजना चाहते हैं उसमें डेटा जोड़ें, फिर आप इसे मुख्य गतिविधि में एक्सेस कर सकते हैं
अभिषेक यादव

अभिषेक यादव, अगर आपकी मुख्य गतिविधि नष्ट होने वाली है (onDestroy () callback)। मुझे लगता है कि यह बहुत अच्छी सलाह नहीं है।
लेओन्त्सेव एंटोन

जवाबों:


472

परिस्थितियों के आधार पर, आप जो चाहते हैं, उसे प्राप्त करने के कुछ तरीके हैं।

सबसे आम परिदृश्य (जो आपके जैसा लगता है) वह है जब उपयोगकर्ता गतिविधि प्राप्त करने के लिए एक बच्चे की गतिविधि का उपयोग किया जाता है - जैसे कि सूची से संपर्क चुनना या संवाद बॉक्स में डेटा दर्ज करना। इस मामले में आपको startActivityForResultअपने बच्चे की गतिविधि शुरू करने के लिए उपयोग करना चाहिए ।

यह मुख्य गतिविधि का उपयोग करके डेटा वापस भेजने के लिए एक पाइपलाइन प्रदान करता है setResult। SetResult विधि एक अंतर परिणाम मान और एक आशय है जो कॉलिंग गतिविधि के लिए वापस पारित किया जाता है।

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

कॉलिंग गतिविधि ओवरराइड में दिए गए डेटा तक पहुँचने के लिए onActivityResult। अनुरोधकोड startActivityForResultकॉल में उत्तीर्ण पूर्णांक से मेल खाता है , जबकि परिणाम और डेटा आशय बाल गतिविधि से लौटाए जाते हैं।

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

4
पूर्णता के लिए किसी को यह उल्लेख करना चाहिए कि कॉल को समाप्त करने के लिए सबसे अच्छी जगह क्या है ()? यह शायद विशेषज्ञों के लिए स्पष्ट है, लेकिन शुरुआती लोगों के लिए अतिरिक्त स्रोतों को संदर्भित किए बिना जानना अच्छा होगा।
कैलिफ जूल

1
@jelmoodjasser मुझे यह पता लगाने में थोड़ा समय लगा, लेकिन मूल रूप से जब आप इरादे के साथ नई गतिविधि शुरू करते हैं तो आपको startActivityForResultफ़ंक्शन का उपयोग करने की आवश्यकता होती है startActivity। एक उदाहरण हो सकता है startActivityForResult(myIntent, 2);जहां 2 परिणाम कोड है, जो MY_CHILD_ACTIVITYऊपर दिए गए स्विच स्टेटमेंट में जगह ले सकता है।
स्पॉटलाइट

जब दूसरी गतिविधि समाप्त हो जाती है और पहली गतिविधि पर वापस आती है तो अनुरोध करें कि इसे समाप्त करने से पहले अनुरोध को दूसरी गतिविधि में कैसे सेट करें .... इसका उपयोग onActivityResult में FirstActivity
Ahamadullah Saikat

क्या इरादा अनिवार्य है? अगर मुझे वापस भेजने के लिए कुछ नहीं है तो क्या मुझे वापस भेजे जाने के लिए खाली इरादे की ज़रूरत है?
Bagus Aji सैंटोसो

@BagusAjiSantoso इरादा वैकल्पिक है, केवल तभी आवश्यक है जब आपके पास वापस भेजने के लिए कुछ भी हो।
नरेंद्र सिंह

186

गतिविधि 1 का उपयोग करता है startActivityForResult :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

गतिविधि 2 लॉन्च की गई है और आप गतिविधि कर सकते हैं, गतिविधि को बंद करने के लिए:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

गतिविधि 1 - पिछली गतिविधि से लौटते समय onActivityResult कहेंगे :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

अद्यतन: Seenu69 की टिप्पणी का उत्तर दें, गतिविधि दो में,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

फिर गतिविधि एक में,

int result = data.getExtra(KEY_RESULT);

नमस्ते वहाँ मैं अपने सवाल का जवाब देने के लिए यू की सराहना करता हूं। यह कोड मेरे लिए पर्याप्त नहीं है। मैं इसके अलावा दूसरी गतिविधि में भी प्रदर्शन करना चाहता हूं और परिणाम onActivityResult विधि के माध्यम से MainActivity को लौटा देना चाहिए। उदाहरण के लिए, मेन एक्टिविटी में केवल एक बटन होता है, जिस पर क्लिक करने के बाद आपको दूसरी गतिविधि में ले जाना होता है, एडिटटेक्स्ट विजेट के माध्यम से दो नंबर दर्ज किए जाते हैं, इसके अलावा दूसरी गतिविधि में ही लॉजिक किया जाता है और अंत में परिणाम मेनऐक्टिविटी में वापस आ जाता है। समझ गया?
सीनू69

2
दूसरी गतिविधि में उस स्थिति में, आप गणना प्रदर्शन करेंगे और पुटटेक्स्ट्रा () के साथ परिणाम को स्टोर करेंगे। मैंने अपना उत्तर ऊपर संपादित किया है
जिमिथिथ

68

डेटा वापस भेज रहा है

यह मुझे चीजों को संदर्भ में देखने में मदद करता है। डेटा वापस भेजने के लिए यहां एक पूरी सरल परियोजना है। Xml लेआउट फ़ाइलें प्रदान करने के बजाय, यहां एक छवि है।

यहां छवि विवरण दर्ज करें

मुख्य गतिविधि

  • इसके साथ दूसरा गतिविधि शुरू करें startActivityForResult, यह एक मनमाना परिणाम कोड प्रदान करता है।
  • ओवरराइड onActivityResult। दूसरी गतिविधि समाप्त होने पर इसे कहा जाता है। आप यह सुनिश्चित कर सकते हैं कि अनुरोध कोड की जाँच करके वास्तव में यह दूसरी गतिविधि है। (यह तब उपयोगी है जब आप एक ही मुख्य गतिविधि से कई अलग-अलग गतिविधियाँ शुरू कर रहे हैं।)
  • रिटर्न से आपको जो डेटा मिला है, उसे निकालें Intent। डेटा को एक कुंजी-मूल्य जोड़ी का उपयोग करके निकाला जाता है।

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // Get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // Set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

दूसरी गतिविधि

  • वह डेटा डालें जिसे आप पिछली गतिविधि में वापस भेजना चाहते हैं Intent। डेटा Intentएक कुंजी-मूल्य जोड़ी का उपयोग करके संग्रहीत किया जाता है ।
  • परिणाम सेट करें RESULT_OKऔर अपना डेटा रखने का इरादा जोड़ें।
  • finish()दूसरी गतिविधि को बंद करने के लिए कॉल करें।

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // Get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // Put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

अन्य नोट

  • यदि आप एक फ्रैगमेंट में हैं तो इसका अर्थ नहीं पता होगा RESULT_OK। बस पूर्ण नाम का उपयोग करें Activity.RESULT_OK:।

यह सभी देखें


यह एक बहुत अच्छी तरह से एक स्पष्ट विवरण लिखा है। बहुत बढ़िया!
किंग्सले इजीके

29

FirstActivity startActivityForResult का उपयोग करता है:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

SecondActivity call setResult () onClick घटनाओं या onBackPressed () पर

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);

क्या यह अनुरोध का परिणाम है?
इंजीर सैयद रौशन अली

15

StartActivityForResult () मेथड कॉल का उपयोग करके बच्चे की गतिविधि के इरादे को कॉल करें

इसका एक उदाहरण यहाँ दिया गया है: http://developer.android.com/training/notepad/notepad-ex2.html

और "स्क्रीन से एक परिणाम लौटना": http://developer.android.com/guide/faq/commontasks.html#opennewscreen


हाँ, मैं cbrulak के साथ संक्षिप्त करता हूं, डॉक्स का लिंक उत्तर की तुलना में अधिक उपयोगी था।
george_h

लिंक अब कुछ सामान्य चीजें दिखा रहे हैं। सामग्री को बदला जा सकता है कृपया इसे अपडेट करें या समुदाय के लिए उत्तर को हटा दें
मनोरंजना

7

मैंने आपके बेहतर संदर्भ के लिए सरल डेमो क्लास बनाया है।

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

और यहाँ SecondActivity.java है

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}

3
अच्छी तरह से समझाया!
राधे

5

पहली गतिविधि में यू का उपयोग करके इरादे भेज सकते हैं startActivityForResult()और फिर इसका उपयोग करने के बाद दूसरी गतिविधि से परिणाम प्राप्त कर सकते हैं setResult

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

1

ये सभी उत्तर डेटा भेजने के बाद आपकी दूसरी गतिविधि के परिदृश्य की व्याख्या कर रहे हैं।

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

दूसरी गतिविधि में -

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

पहली गतिविधि में-

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

रिसीवर को onCreate में पंजीकृत करें () -

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

इसे OnDestroy () में अपंजीकृत करें


0

वांछित परिणाम प्राप्त करने का एक और तरीका जो आपकी स्थिति के आधार पर बेहतर हो सकता है वह है श्रोता इंटरफ़ेस बनाना।

अभिभावक गतिविधि को एक इंटरफेस के रूप में सुनते हैं, जो आवश्यक गतिविधि के रूप में आवश्यक डेटा पास करते समय बाल गतिविधि द्वारा ट्रिगर हो जाता है, एक समान परिस्थिति परिस्थिति का निर्माण कर सकता है।


-1

ऐसा करने के कुछ तरीके हैं। 1. स्टार्ट एक्टीविटीफोरसेट () का उपयोग करके जो उपरोक्त उत्तरों में बहुत अच्छी तरह से समझाया गया है।

  1. अपने "यूटिल्स" वर्ग या अपने स्वयं के किसी अन्य वर्ग में स्थिर चर बनाकर। उदाहरण के लिए मैं स्टूडेंटआईडी को एक्टिविटीबी से एक्टिविएट पास करना चाहता हूं। पहले मेरी एक्टिवा एक्टिविबी को कॉल कर रही है। फिर एक्टिविटीबी के अंदर स्टूडेंटआईडी सेट करें (जो कि यूटिल्स.क्लास में एक स्थिर फील्ड है)। इस तरह Utils.STUDENT_ID = "1234"; फिर गतिविधि पर वापस आते समय छात्र का उपयोग करें जो कि Utils.STUDENT_ID में संग्रहीत है।

  2. अपने एप्लिकेशन क्लास में एक गेटटर और सेटर विधि बनाकर।

इस तरह:

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

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


-1

बस एक छोटा सा विवरण जो मुझे लगता है कि उपरोक्त उत्तरों में गायब है।

अपने बच्चे गतिविधि कई माता-पिता की गतिविधियों से खोला जा सकता है, तो आप देख सकते हैं कि आप क्या करने की जरूरत setResultहै या नहीं, पर अपनी गतिविधि द्वारा खोला गया था अगर आधारित startActivityया startActivityForResult। आप इसका उपयोग करके प्राप्त कर सकते हैं getCallingActivity()। अधिक जानकारी यहाँ


-2

SharePreferences का उपयोग करें और अपने डेटा को बचाएं और इसे एप्लिकेशन में कहीं से भी एक्सेस करें

इस तरह तारीख को बचाओ

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

और इस तरह से डेटा प्राप्त करते हैं

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

6
यह अधिक उपयुक्त होगा यदि दूसरी गतिविधि एप्लिकेशन में स्थायी परिवर्तन / सेटिंग स्थापित कर रही हो।
elimirks

अगर मैं 2 अलग-अलग एंड्रॉइड ऐप के बीच डेटा साझा करना चाहता हूं तो क्या यह काम करेगा? एक को लाइब्रेरी कहा जाता है?
जॉय रोहन

21
यह SharedPreferences दुरुपयोग है।
एरन गोल्डिन

1
केवल दो गतिविधियों (ओपी के मूल प्रश्न) के बीच डेटा पास करने के लिए इस पद्धति का उपयोग करना साझाकरणों का दुरुपयोग करने जैसा है। इसका मतलब यह नहीं है और दो कार्यों के बीच डेटा पास करने जैसे सरल कार्य के लिए सिस्टम को बहुत अधिक काम करना पड़ता है (स्टोरेज पर xml लिखना और इसे फिर से पढ़ना)।
सुदरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.