Parametre ile bir Faaliyet Başlatma


293

Android geliştirmede çok yeniyim.

Bir oyun hakkında bilgi göstermek için bir etkinlik oluşturmak ve başlatmak istiyorum. Bir oyuna ihtiyacım olduğunu gösteren bilgileri gösteriyorum.

Bu oyun kimliğini etkinliğe nasıl aktarabilirim? Oyun kimliği kesinlikle gereklidir, bu yüzden kimliği yoksa etkinliği oluşturmak veya başlatmak istemiyorum.

Aktivitenin bir parametreye sahip sadece bir kurucusu var gibi .

Bunu nasıl yapabilirim?

Teşekkürler.

Yanıtlar:


509

Bir koyun intyeni halinde kimliği olan 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();

Ardından, yeninizdeki kimliği alın Activity:

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

42
Emin b yapmak isteyebilirsiniz = null ondan kapma başlamadan önce!
Andrew

Bu koddaki ikinci etkinlikte "b" nasıl boş olabilir? İkinci aktivite oluşturma yönteminde b boş olur.
Murat Çorlu

3
B null olabilir, diyelim ki bu aktiviteyi başka bir yerden başlatmak istiyorsunuz ve bunu standart bir şekilde, hiçbir parametre olmadan yapıyorsunuz. Bir NPE atacak. Her zaman bu parametreleri isteğe bağlı olarak düşünmelisiniz.
Gaspar de Elias

53
Yeni bir Paket oluşturmak gerekli değildir (ve belgeleri yaparsanız, anahtarlarınızın önekini almak için paket adını kullanmanız gerektiğini söyler.) Basitçe kullanın intent.putExtra(String, Int).
Sam

1
Bir boş kontrol yapmamak daha iyi olduğunu iddia olabilir. en.wikipedia.org/wiki/Fail-fast .
setholopolus

124

Etkinliğinizi aramak için kullandığınız Niyet'e fazladan veri eklemeniz yeterlidir.

Arayan etkinliğinde:

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

Aradığınız aktivitenin onCreate () yönteminin içinde:

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

1
özel nesne türünü iletmek uygun mudur?
Amyth

1
@Amyth Hayır, kabul edilen cevapta olduğu gibi bir paket kullanmalısınız.
AtlasRider


38

İkinci etkinlikte statik bir yöntemle yapmayı seviyorum:

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

Sonra ilk etkinliğinizden (ve başka herhangi bir yer için) şunları yaparsınız:

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

Tam aradığım şey! Teşekkür ederim
Matteo

1
OnCreate yöntemde olmamalıdır String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);olmakString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

Statik olması testinizi zorlaştıracaktır.
John Tribe

Bu bir bellek sızıntısı mı? Bağlamı statik bir yönteme aktarmak benim için kötü bir fikir gibi görünüyor. Neden sadece niyeti geri döndürmüyor ve daha sonra birinci sınıftan bu amacı kullanarak aktiviteye başlamıyorsunuz?
AndroidDev

4

Kotlin kodu:

Başla SecondActivity:

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

Kimliği girin 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
    }
}

burada gameIdbir String? (boş olabilir)


3

Varolan cevaplar ( Intentiletilen iletiyi ilet startActivity()) bu sorunu çözmenin normal yolunu gösterir. Başka bir uygulama tarafından başlatılacak bir Etkinlik oluşturduğunuz (örneğin, bir Tasker eklentisindeki düzenleme etkinliklerinden biri ) ve dolayısıyla Intenthangisinin başlatıldığını kontrol etmeyen garip durumda kullanılabilecek başka bir çözüm var Activity.

ActivityParametreli bir kurucuya sahip bir temel sınıf , ardından temel sınıf kurucusunu bir değerle çağıran varsayılan bir kurucuya sahip türetilmiş bir sınıf oluşturabilirsiniz:

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

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

Temel sınıf yapıcısına iletilecek parametreyi oluşturmanız gerekiyorsa, sabit kodlanmış değeri, geçilecek doğru değeri döndüren bir işlev çağrısıyla değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.