Blog Educativo.pl Menu

Link:

Komunikacja pomiędzy komponentami aplikacji

w kategoriiAndroid przez Piotr Potulski
Skomentuj

an1Problem, który wyjątkowo często pokazuje się na forach internetowych, wśród początkujących programistów Androida, to przesyłanie danych pomiędzy aktywnościami. Postaram się pokazać na możliwie prostym przykładzie jak rozwiązać ten często występujący i jak się okazuje, nie taki oczywisty przypadek.

Przykład jest prosty – mamy dwie aktywności (activity). W jednej z nich pytamy użytkownika o imię, w drugiej uruchamianej po pobraniu danych wyświetlamy personalizowany komunikat. W „standardowej” Java sprawa jest prosta – wrzucamy dodatkowy parametr do konstruktora klasy wyświetlającej wiadomość i po zmartwieniu.

W Androidzie nie uruchamiamy Activity (i innych komponentów aplikacji) poprzez bezpośrednie wywołanie konstruktora, a wysyłając Intent do systemu, który robi z nim, co uzna za stosowne. Oczywiście świadomy programista Java poradzi sobie z problemem w ten czy inny sposób – utworzy klasę Singleton (odsyłam do wzorców projektowych) i będzie działać. Pozostaje pytanie po co? Przecież Android przewiduje prosty i łatwy sposób na przekazanie potrzebnych danych. Zagadnienie to jest oczywiście poruszone w kursie programowania, ale tak czy inaczej postanowiłem zgłębić problem tutaj.

Chodzi nam o osiągnięcie takiego rezultatu:

Screenshot_2013-05-26-13-51-31Screenshot_2013-05-26-13-51-36

W tym celu utworzyłem dwa komponenty Activity:

package plcom.digita.example.communicationexample; 

import android.content.Intent; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    public static final String KEY_NAME = "key_name"; 
    //layout handlers 
    private EditText editTextName; 
    private Button buttonSend;

 

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

        //layout handlers initialization 
        editTextName = (EditText)findViewById(R.id.editText); 
        buttonSend = (Button) findViewById(R.id.button); 

        buttonSend.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View view) { 
                Intent i = new Intent(MainActivity.this, ActivityShowResult.class); 
                i.putExtra(KEY_NAME, editTextName.getText().toString()); 

                startActivity(i); 
            } 
        }); 
    }

 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.main, menu); 
        return true; 
    } 

}

Oraz klasę wyświetlającą odpowiedź:

package plcom.digita.example.communicationexample; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.TextView; 

/** 
 * Created by Piotr on 26.05.13. 
 */ 
public class ActivityShowResult extends Activity { 

    //layout handlers 
    private TextView textViewResult;

 

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.result_layout); 

        //layout handler initialization 
        textViewResult = (TextView) findViewById(R.id.textViewResult); 

        //parsing input intent 
        Intent intentInput = getIntent(); 
        Bundle bundleInputData = intentInput.getExtras(); 
        CharSequence stringName = bundleInputData.getCharSequence(MainActivity.KEY_NAME); 

        //creating user message 
        // pattern: "Hello %s, you have done this exercise well." 
        String stringResult = String.format(getString(R.string.hello_message_pattern), stringName); 

        //displaying result 
        textViewResult.setText(stringResult); 

    } 
}

 

Cały trik, to linie wstawiające dane do Intentu, oraz wyciągające te dane po stronie drugiego Activity., czyli:

 i.putExtra(KEY_NAME, editTextName.getText().toString());

oraz:

Intent intentInput = getIntent(); 
        Bundle bundleInputData = intentInput.getExtras(); 
        CharSequence stringName = bundleInputData.getCharSequence(MainActivity.KEY_NAME);

 

Pozdrawiam i życzę dobrej zabawy. W następnych odcinku rozwinę omówione na kursie zagadnienie tworzenia własnych kontrolek ekranowych, tym razem na żywym i działającym przykładzie. Jeżeli macie jakieś pytania, lub propozycje – komentujcie, bądź kontaktujcie się ze mną bezpośrednio piotrpo(małpa)gmail.com

 

  • sylwia

    Hej , jestem początkującym programista w Android Studio. Mam problem z //creating user message
    // pattern: „Hello %s, you have done this exercise well.”
    String stringResult = String.format(getString(R.string.hello_message_pattern), stringName);
    hello_message_pattern – gdzie tę zmienną wcześnie zadeklarowałes??

  • Dziękujemy za skomenentowanie, dozwolone znaczniki html to strong, code i href.