Jak używać putExtra () i getExtra () dla danych łańcuchowych


318

Czy ktoś może mi powiedzieć, jak dokładnie używać getExtra()i putExtra()do celów? Właściwie mam zmienną łańcuchową, powiedzmy str, która przechowuje niektóre dane łańcuchowe. Teraz chcę wysłać te dane z jednego działania do drugiego.

  Intent i = new Intent(FirstScreen.this, SecondScreen.class);   
  String keyIdentifer  = null;
  i.putExtra(strName, keyIdentifer );

a następnie w SecondScreen.java

 public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table);
        TextView userName = (TextView)findViewById(R.id.userName);
        Bundle bundle = getIntent().getExtras();

        if(bundle.getString("strName")!= null)
        {
            //TODO here get the string stored in the string variable and do 
            // setText() on userName 
        }

    }

Wiem, że to bardzo podstawowe pytanie, ale niestety utknąłem tutaj. Proszę pomóż.

Dzięki,

Edycja: Tutaj ciąg, który próbuję przekazać z jednego ekranu na drugi, jest dynamiczny. To znaczy, że mam editText, w którym otrzymuję ciąg niezależnie od typu użytkownika. Następnie z pomocą myEditText.getText().toString(). Otrzymuję wprowadzoną wartość jako ciąg, a następnie muszę przekazać te dane.


i.putExtra (strName, keyIdentifer); Ta instrukcja ma zmienną strName, a bundle.getString („strName”) ma ciąg „strName”. Jego intent.putExtra (klucz, wartość) i intent.getExtras (). GetString (klucz); upewnij się, że używasz tego samego klucza w zestawie i weź.
wydają się

Odpowiedzi:


416

Użyj tego, aby „umieścić” plik ...

Intent i = new Intent(FirstScreen.this, SecondScreen.class);   
String strName = null;
i.putExtra("STRING_I_NEED", strName);

Następnie, aby pobrać wartość, spróbuj czegoś takiego:

String newString;
if (savedInstanceState == null) {
    Bundle extras = getIntent().getExtras();
    if(extras == null) {
        newString= null;
    } else {
        newString= extras.getString("STRING_I_NEED");
    }
} else {
    newString= (String) savedInstanceState.getSerializable("STRING_I_NEED");
}

10
czy kod „saveInstanceState ...” i „... getSerialiable” jest używany do obsługi zmian orientacji? jeśli nie, do czego służy ten kod?
AJW,

Używam Androida 3.0.1 i musiałem użyć this.getActivity().getIntent().getExtras().
Tyler,

Jeśli używasz PendingIntents, musisz użyć flagi „PendingIntent.FLAG_UPDATE_CURRENT”: stackoverflow.com/a/29846408/2738240 Intent intent = nowy Intent (kontekst, MainActivity.class); intent.putExtra („button_id”, 1); PendingIntent pendingIntent = PendingIntent.getActivity (kontekst, 0, zamiar, PendingIntent.FLAG_UPDATE_CURRENT); Widoki RemoteViews = nowe RemoteViews (context.getPackageName (), R.layout.my_test_widget); views.setOnClickPendingIntent (R.id.my_test_widget_button_1, pendingIntent);
Matthias Luh

69

pierwszy Screen.java

text=(TextView)findViewById(R.id.tv1);
edit=(EditText)findViewById(R.id.edit);
button=(Button)findViewById(R.id.bt1);

button.setOnClickListener(new OnClickListener() {
    public void onClick(View arg0) {
        String s=edit.getText().toString();

        Intent ii=new Intent(MainActivity.this, newclass.class);
        ii.putExtra("name", s);
        startActivity(ii);
    }
});

Drugi Screen.java

public class newclass extends Activity
{
    private TextView Textv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.intent);
        Textv = (TextView)findViewById(R.id.tv2);
        Intent iin= getIntent();
        Bundle b = iin.getExtras();

        if(b!=null)
        {
            String j =(String) b.get("name");
            Textv.setText(j);
        }
    }
}

52

Najlepsza metoda ...

SendingActivity

Intent intent = new Intent(SendingActivity.this, RecievingActivity.class);
intent.putExtra("keyName", value);  // pass your values and retrieve them in the other Activity using keyName
startActivity(intent);

RecievingActivity

 Bundle extras = intent.getExtras();
    if(extras != null)
    String data = extras.getString("keyName"); // retrieve the data using keyName 

/// najkrótszy sposób na uzyskanie danych ..

String data = getIntent().getExtras().getString("keyName","defaultKey");

// Wymaga interfejsu API 12. // drugi parametr jest opcjonalny. Jeśli nazwa_klucza jest pusta, użyj defaultkeydanych jako.


18

To jest to, z czego korzystam, mam nadzieję, że pomaga komuś .. prosty i uczuciowy.

Wyślij dane

    intent = new Intent(getActivity(), CheckinActivity.class);
    intent.putExtra("mealID", meal.Meald);
    startActivity(intent);

otrzymać dane

    int mealId;

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();

    if(bundle != null){
        mealId = bundle.getInt("mealID");
    }

Twoje zdrowie!


1
Wciąż muszę od czasu do czasu przypominać sobie, jak to zrobiono poprawnie .. lol!
Sindri Þór

10

Jest bardzo łatwy do wdrożenia intentw Androidzie .. Przeniesienie z jednej aktywności do innej aktywności, mamy dwie metody, putExtra();a getExtra();teraz pokazuję wam przykład ..

    Intent intent = new Intent(activity_registration.this, activity_Login.class);
                intent.putExtra("AnyKeyName", Email.getText().toString());  // pass your values and retrieve them in the other Activity using AnyKeyName
                        startActivity(intent);

Teraz musimy uzyskać wartość z AnyKeyNameparametru, pomoże w tym poniższy kod

       String data = getIntent().getExtras().getString("AnyKeyName");
        textview.setText(data);

Możemy łatwo ustawić wartość odbiorczą z Intentdowolnego miejsca.


6

Mały dodatek: nie musisz tworzyć własnej nazwy dla klucza, android zapewnia je, np. Intent.EXTRA_TEXT. Modyfikacja zaakceptowanej odpowiedzi:

Intent i = new Intent(FirstScreen.this, SecondScreen.class);   
String strName = null;
i.putExtra(Intent.EXTRA_TEXT, strName);

Następnie, aby pobrać wartość, spróbuj czegoś takiego:

String newString;
Bundle extras = getIntent().getExtras();
if(extras == null) {
    newString= null;
} else {
    newString= extras.getString(Intent.EXTRA_TEXT);
}

4
Intent intent = new Intent(view.getContext(), ApplicationActivity.class);
                        intent.putExtra("int", intValue);
                        intent.putExtra("Serializable", object);
                        intent.putExtra("String", stringValue);
                        intent.putExtra("parcelable", parObject);
                        startActivity(intent);

ApplicationActivity

Intent intent = getIntent();
Bundle bundle = intent.getExtras();

if(bundle != null){
   int mealId = bundle.getInt("int");
   Object object = bundle.getSerializable("Serializable");
   String string = bundle.getString("String");
   T string = <T>bundle.getString("parcelable");
}

4

Aktualizacja w klasie Intent .

  • Służy hasExtra()do sprawdzania, czy zamiar ma dane na kluczu.
  • Możesz teraz użyć getStringExtra()bezpośrednio.

Przekaż dane

intent.putExtra(PutExtraConstants.USER_NAME, "user");

Otrzymać dane

String userName;
if (getIntent().hasExtra(PutExtraConstants.USER_NAME)) {
    userName = getIntent().getStringExtra(PutExtraConstants.USER_NAME);
}

Zawsze umieszczaj klucze w stałych jako najlepszą praktykę.

public interface PutExtraConstants {
    String USER_NAME = "USER_NAME";
}

Dlaczego PutExtraConstantsinterfejs?
Big_Chair

@Big_Chair Ponieważ PutExtraConstantsklasa zawiera tylko stałe ( public, static, final). Dlatego lepiej jest używać interfejsu dla stałych.
Khemraj

3

Prościej

strona nadawcy

Intent i = new Intent(SourceActiviti.this,TargetActivity.class);
i.putExtra("id","string data");
startActivity(i)

strona odbiornika

Intent i = new Intent(SourceActiviti.this,TargetActivity.class);
String strData = i.getStringExtra("id");

3

Umieść ciąg w obiekcie docelowym

  Intent intent = new Intent(FirstActivity.this,NextAcitivity.class);
  intent.putExtra("key",your_String);
  StartActivity(intent);

NextAcitvity w metodzie onCreate otrzymuje String

String my_string=getIntent().getStringExtra("key");

to łatwa i krótka metoda


2

wysłać

startActivity(new Intent(First.this, Secend.class).putExtra("key",edit.getText.tostring));

dostać

String myData = getIntent.getStringExtra("key");

1

funkcja wprowadzania

etname=(EditText)findViewById(R.id.Name);
        tvname=(TextView)findViewById(R.id.tvName);

        b1= (ImageButton) findViewById(R.id.Submit);

        b1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                String s=etname.getText().toString();

                Intent ii=new Intent(getApplicationContext(), MainActivity2.class);
                ii.putExtra("name", s);
                Toast.makeText(getApplicationContext(),"Page 222", Toast.LENGTH_LONG).show();
                startActivity(ii);
            }
        });



getfunction 

public class MainActivity2 extends Activity {
    TextView tvname;
    EditText etname;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);
        tvname = (TextView)findViewById(R.id.tvName);
        etname=(EditText)findViewById(R.id.Name);
        Intent iin= getIntent();
        Bundle b = iin.getExtras();

        if(b!=null)
        {

          String j2 =(String) b.get("name");

etname.setText(j2);
            Toast.makeText(getApplicationContext(),"ok",Toast.LENGTH_LONG).show();
        }
    }

1

Dane push

import android.content.Intent;

    ...

    Intent intent = 
        new Intent( 
            this, 
            MyActivity.class );
    intent.putExtra( "paramName", "paramValue" );
    startActivity( intent );

Powyższy kod może znajdować się w głównym activity. „ MyActivity.class” to sekunda, Activityktórą chcemy uruchomić; musi być wyraźnie dołączony do twojego AndroidManifest.xmlpliku.

<activity android:name=".MyActivity" />

Wyciągnij dane

import android.os.Bundle;

    ...

    Bundle extras = getIntent().getExtras();
    if (extras != null)
    {
        String myParam = extras.getString("paramName");
    }
    else
    {
        //..oops!
    }

W tym przykładzie powyższy kod będzie w twoim MyActivity.java pliku.

Gotchas

Ta metoda może tylko przejść strings. Powiedzmy, że musisz przekazać ArrayListswojemuListActivity ; możliwym obejściem jest przekazanie ciągu rozdzielanego przecinkami, a następnie podzielenie go na drugą stronę.

Alternatywne rozwiązania

Posługiwać się SharedPreferences


a co jeśli chcę przekazać ciąg z pliku string.xml?
HB.

1

Proste, w pierwszej aktywności

    EditText name= (EditText) findViewById(R.id.editTextName);
    Button button= (Button) findViewById(R.id.buttonGo);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            i.putExtra("name",name.getText().toString());
           startActivity(i);
          }
    });

W drugim ćwiczeniu

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    TextView t = (TextView) findViewById(R.id.textView);
    Bundle bundle=getIntent().getExtras();
    String s=bundle.getString("name");
    t.setText(s);
}

Możesz dodać warunki if / else, jeśli chcesz.


1

Na FirstScreen.java

    Intent intent = new Intent(FirstScreen.this, SecondScreen.class);
    String keyIdentifier = null;
    intent.putExtra(strName, keyIdentifier);

Na SecondScreen.java

    String keyIdentifier;
    if (savedInstanceState != null)
        keyIdentifier= (String) savedInstanceState.getSerializable(strName);
    else
        keyIdentifier = getIntent().getExtras().getString(strName);

Witamy w SO! Edytuj swoją odpowiedź i wyjaśnij, dlaczego i jak to rozwiązuje problem. Aby uzyskać więcej wskazówek, zobacz stackoverflow.com/help/how-to-answer
B - rian

0

umieść ciąg na pierwszym miejscu

Intent secondIntent = new Intent(this, typeof(SecondActivity));
            secondIntent.PutExtra("message", "Greetings from MainActivity");

odzyskaj to potem

var message = this.Intent.GetStringExtra("message");

to wszystko ;)


-1

Możesz po prostu użyć zmiennej statycznej, aby zapisać ciąg tekstu edittext, a następnie użyć tej zmiennej w innej klasie. Mam nadzieję, że to rozwiąże twój problem


Państwo może , ale nie należy :-)
Blundell
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.