Esto es realmente una pregunta engañosamente "simple", pero en realidad es un problema complicado en el contexto del desarrollo de Android.
Las actividades son el "punto de entrada al proceso", lo que significa que cualquier actividad que vea puede actuar como el "primer punto de entrada a su aplicación en el inicio".La gente piensa que solo la Actividad que tiene el filtro de intención MAIN/LAUNCHER
se puede iniciar al inicio, pero esto es falso.
Cualquier actividad puede actuar como la "primera actividad", porque Android puede reiniciarlo desde cualquier punto con la pila de navegación activa actual.
De todos modos, una Actividad puede mostrar View
, y las personas a menudo usan la Actividad para mantener cada pantalla de su aplicación (en lugar de usarla como punto de entrada e intercambiar controladores de vista en ella ~ fragmentos)
Así que si usted tiene múltiples actividades, entonces usted necesita para compartir datos entre ellos de tal manera, que se toma en consideración que ambas actividades se pueden iniciar en cualquier momento como elprimeraActividad de la aplicación.
Para esto, lo que hay que hacer no es "establece el texto de la vista de texto directamente de otra clase", pero hay que modificar los datos compartidos observables.
La nueva versión oficial Android Architecture Components proporciona la clase LiveData<T>
, que tiene una subclase llamada MutableLiveData<T>
.
Para actualizar los datos de una clase a otra actividad, lo que debe hacer es tener un conjunto de datos globales expuestos como LiveData LiveData
public class MyApplication extends Application {
private static MyApplication INSTANCE;
DataRepository dataRepository; // this is YOUR class
@Override
public void onCreate() {
super.onCreate();
INSTANCE = this;
dataRepository = new DataRepository();
}
public static MyApplication get() {
return INSTANCE;
}
}
El DataRepository
debe exponer:
public class DataRepository {
private final MutableLiveData<MyData> data = new MutableLiveData<>();
public LiveData<MyData> getMyData() {
return data;
}
public void updateText(String text) {
MyData newData = data.getValue()
.toBuilder() // immutable new copy
.setText(text)
.build();
data.setValue(newData);
}
}
Cuando el La actividad se suscribe a esto:
public class MyActivity extends AppCompatActivity {
DataRepository dataRepository;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApplication app = (MyApplication)getApplicationContext();
dataRepository = app.getDataRepository();
setContentView(R.layout.main_activity);
textView = findViewById(R.id.textview);
dataRepository.getMyData().observe(this, new Observer() {
@Override
public void onChange(MyObject myObject) {
textView.setText(myObject.getText());
}
}
}
Así que para actualizar esto texto, que necesita para obtener la clase DataRepository
, y llamar a updateText
en él:
DataRepository dataRepository = MyApplication.get().dataRepository();
dataRepository.updateText("my new text");
Y esto actualizará correctamente su vista de texto de actividad.
En realidad, no quiero alardear ni nada, pero la única respuesta correcta es la que proporcioné: https://stackoverflow.com/questions/10996479/how-to-update-a-textview-of-an -activity-from-another-class/47637313 # 47637313 (aunque Elye también está bien, siempre que tengan en cuenta la muerte del proceso) – EpicPandaForce