एक पैरामीटर के साथ एक गतिविधि शुरू करें


292

मैं Android विकास पर बहुत नया हूं।

मैं गेम के बारे में जानकारी दिखाने के लिए एक गतिविधि बनाना और शुरू करना चाहता हूं। मुझे लगता है कि मैं एक gameId की जरूरत है कि जानकारी दिखाते हैं।

मैं इस गेम आईडी को गतिविधि में कैसे पास कर सकता हूं? गेम आईडी पूरी तरह से आवश्यक है, इसलिए यदि मेरे पास आईडी नहीं है तो मैं गतिविधि बनाना या शुरू करना नहीं चाहता।

यह ऐसा है जैसे गतिविधि को एक पैरामीटर के साथ केवल एक निर्माता मिला है ।

मैं उसे कैसे कर सकता हूँ?

धन्यवाद।

जवाबों:


507

intजो आपकी आईडी है उसे नए में डालें Intent

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Bundle b = new Bundle();
b.putInt("key", 1); //Your id
intent.putExtras(b); //Put your id to your next Intent
startActivity(intent);
finish();

फिर अपने नए में आईडी को पकड़ो Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");

42
इससे पहले कि आप इसे हथियाना शुरू करें, आप इसे सुनिश्चित करना चाहते हैं! = Null
एंड्रयू

इस कोड में "बी" दूसरी गतिविधि में कैसे अशक्त हो सकता है? I b दूसरी गतिविधि की विधि बनाने पर शून्य है।
मुरात Murorlu

3
B अशक्त हो सकता है, आपको यह गतिविधि किसी अन्य स्थान से शुरू करने की अनुमति देता है और आप इसे मानक तरीके से करते हैं, जिसमें कोई पैरामेस नहीं है। यह एक NPE फेंक देगा। आपको हमेशा इस परम विकल्प पर विचार करना चाहिए।
गैसपार डी एलियास

53
यह एक नया बंडल बनाने के लिए आवश्यक नहीं है (और यदि आप प्रलेखन करते हैं तो आप कहते हैं कि आपको अपनी कुंजी को उपसर्ग करने के लिए पैकेज नाम का उपयोग करना चाहिए।) बस उपयोग करें intent.putExtra(String, Int)
सैम

1
कोई यह तर्क दे सकता है कि इसकी बेहतर जांच करना बेहतर नहीं है। en.wikipedia.org/wiki/Fail-fast
सेहोपोलोपस

124

अपनी गतिविधि को कॉल करने के लिए आपके द्वारा उपयोग किए जाने वाले इरादे में अतिरिक्त डेटा जोड़ें।

कॉलर गतिविधि में:

Intent i = new Intent(this, TheNextActivity.class);
i.putExtra("id", id);
startActivity(i);

आपके द्वारा की जाने वाली गतिविधि के ऑनक्रिएट () के अंदर:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");

1
क्या कस्टम ऑब्जेक्ट प्रकार में पास करना ठीक है?
एमीथ

1
@ एमीथ नो, आपको स्वीकृत उत्तर की तरह एक बंडल का उपयोग करना होगा।
AtlasRider

इसे देखें @Athth: stackoverflow.com/questions/14333449/…
कोल्ड

38

मैं इसे दूसरी गतिविधि में स्थिर विधि से करना पसंद करता हूं:

private static final String EXTRA_GAME_ID = "your.package.gameId";

public static void start(Context context, String gameId) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra(EXTRA_GAME_ID, gameId);
    context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    ... 
    Intent intent = this.getIntent();
    String gameId = intent.getStringExtra(EXTRA_GAME_ID);
}

फिर अपनी पहली गतिविधि से (और कहीं और के लिए), आप बस करें:

SecondActivity.start(this, "the.game.id");

ठीक वही जो मेरे द्वारा खोजा जा रहा था! धन्यवाद
Matteo

1
OnCreate विधि में नहीं String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);होना चाहिएString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

स्टैटिक्स होने से आपकी परीक्षा बहुत कठिन हो जाएगी।
जॉन जनजाति

क्या यह स्मृति रिसाव है? एक स्थैतिक विधि में संदर्भ को पास करना मेरे लिए एक बुरे विचार की तरह लगता है। सिर्फ इरादा वापस क्यों नहीं किया और फिर पहली कक्षा से उस इरादे का उपयोग करके गतिविधि शुरू करें?
AndroidDev

4

कोटलिन कोड:

प्रारंभ करें SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

इसमें आईडी प्राप्त करें SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

कहाँ gameIdहै String? (अशक्त हो सकता है)


3

मौजूदा जवाब (में डेटा पास Intentकरने के लिए पारित कर दिया startActivity()) इस समस्या को हल करने के लिए सामान्य तरीके से दिखाते हैं। एक और समाधान है जिसका उपयोग उस विषम स्थिति में किया जा सकता है जहां आप एक ऐसी गतिविधि का निर्माण कर रहे हैं जिसे किसी अन्य ऐप द्वारा शुरू किया जाएगा (उदाहरण के लिए, एक टास्कर प्लगइन में संपादन गतिविधियों में से एक ) और इसलिए Intentजो लॉन्च करता है उसे नियंत्रित नहीं करता है Activity

आप एक बेस-क्लास बना सकते हैं Activityजिसमें एक पैरामीटर के साथ एक कंस्ट्रक्टर होता है, फिर एक व्युत्पन्न वर्ग जिसमें एक डिफॉल्ट कंस्ट्रक्टर होता है, जो बेस क्लास कंस्ट्रक्टर को वैल्यू के साथ कॉल करता है:

class BaseActivity extends Activity
{
    public BaseActivity(String param)
    {
        // Do something with param
    }
}

class DerivedActivity extends BaseActivity
{
    public DerivedActivity()
    {
        super("parameter");
    }
}

यदि आपको बेस-क्लास कंस्ट्रक्टर को पास करने के लिए पैरामीटर उत्पन्न करने की आवश्यकता है, तो बस हार्ड-कोडेड मान को फ़ंक्शन कॉल के साथ बदलें जो पास करने के लिए सही मान लौटाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.