Cómo actualizar un TextView de una actividad de otra clase

Soy nuevo en la progtwigción de android / java. Tengo dos clases, una es una actividad y otra clase normal. En mi clase de actividad contiene TextView. ¿Puedo actualizar TextView de la clase de actividad de la clase normal? Intenté con un código aleatorio, pero falla. Por favor, brinde una solución …

// activity class public class MainMenu extends Activity { public TextView txtView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView txtView = (TextView)findViewById(R.id.text); } } // other class public class ClassB { public ClassB(){ } public void Update(){ TextView txtView = (TextView)findViewById(R.id.text); txtView.setText("Hello"); } } 

Tienes que pasar la referencia de contexto a través del constructor.

 public class ClassB { Context context; public ClassB(Context context){ this.context=context; } public void Update(){ TextView txtView = (TextView) ((Activity)context).findViewById(R.id.text); txtView.setText("Hello"); } 

Los dos ejemplos anteriores requieren que TextView se use directamente dentro de la otra clase. Sin embargo, hay casos donde TextView no debería estar presente en la otra clase. por ejemplo, tu clase B se usa para actualizar varias actividades, donde alguna actividad se actualizó en TextView, otras podrían estar en EditText.

Por lo tanto, la siguiente solución lo guía sobre cómo puede desacoplar su TextView de otra clase, sin embargo, aún puede lograr lo que desea. Está usando el enfoque de Interfaz.

En primer lugar, declare una interfaz donde podría tener la clase B para comunicarse con la Actividad, llamándola MyCallBack

 public interface MyCallBack { // Declaration of the template function for the interface public void UpdateMyText(String mystr); } 

A continuación en tu Actividad, implementa MyCallBack, y por lo tanto es definición de función. En esta función, recibirás el String de la Clase B, que puedes hacer lo que quieras, por ejemplo, actualizar TextView (o EditText, etc.)

 public Class MyActivity extends activity implements MyCallBack; { // ... whatever code of your activity @Overrid public void UpdateMyText(String mystr) { TextView txtView = (TextView)findViewById(R.id.text); txtView.setText(mystr); } } 

Por último, puede declarar ClassB que acepta MyCallBack (es decir, su objeto clase Activity que también es MyCallBack). Desde allí, puedes usar ClassB para volver a comunicarte con Activity y conseguir que actualice su TextView a través de la función UpdateMyText.

 public class ClassB { MyCallBack mCallBack = null; public ClassB(MyCallBack callBack){ this.mCallBack=callBack; } public void dosomething(){ // Do something to get String String myString = str; this.mCallBack.UpdateMyText(str); } 

Espero que esto ayude a una estructura mejor estructurada de desacoplamiento de la propiedad Activity de ClassB.

Esta es 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 al 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 reiniciarla desde cualquier punto con la stack de navegación activa actual.

De todos modos, con eso en mente, una actividad puede mostrar una 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, y cambiar los controladores de vista en ella ~ fragmentos).

Por lo tanto, si tiene varias actividades, debe compartir datos entre ellas de tal forma que tenga en cuenta que ambas actividades se pueden iniciar en cualquier momento como la primera actividad de la aplicación .


Para esto, lo que debe hacer no es “configurar el texto de la vista de texto directamente desde otra clase”, sino que debe modificar los datos compartidos observables .

Los Componentes de Arquitectura de Android oficiales lanzados recientemente proporcionan la LiveData , que tiene una subclase llamada MutableLiveData .

Para actualizar los datos de una clase a otra Actividad, lo que debe hacer es tener una información global expuesta como un 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 LiveData:

 public class DataRepository { private final MutableLiveData data = new MutableLiveData<>(); public LiveData getMyData() { return data; } public void updateText(String text) { MyData newData = data.getValue() .toBuilder() // immutable new copy .setText(text) .build(); data.setValue(newData); } } 

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

Entonces, para actualizar este texto, necesitas 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.

Puedes hacer un método getter en tu Activity .

En tu clase de Activity :

 public TextView getTextView() { TextView txtView = (TextView)findViewById(R.id.text); return txtView; } 

En tu clase ClassB :

 public void Update() { MainMenu obj = new MainMenu(); TextView tv = obj.getTextView(); tv.setText("hello"); } 

puedes hacer lo siguiente. Lo intenté y funcionó. Simplemente pase la referencia al TextView mientras llama al método desde otra clase. El problema en su versión es que hay conflicto entre TextView porque lo declara dos veces. En cambio, solo denúncielo una vez y páselo como argumento mientras llama al método en otra clase. ¡¡Aclamaciones!!

  // activity class public class MainMenu extends Activity { public TextView txtView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView txtView = (TextView)findViewById(R.id.text); ClassB.update(txtView); } } // other class public class ClassB { public ClassB(){ } public void update(TextView tv){ tv.setText("Hello"); } } 

Esto se puede administrar fácilmente de forma simple a los pasos.

=============================

1) Actividad a Fragmento Múltiple

debajo de la línea puede escribir en la clase Fragment a través de FindViewById

((TextView) ((Actividad) getActivity ()). FindViewById (R.id.textview)). SetText (“”);