Cómo utilizar la interfaz para comunicarse entre dos actividades
Estoy tratando de hacer interfaz de escucha entre dos actividades Act1 and Act2
. Act1
comenzará Act2
. Si hay algún evento ocurrido en Act2
, lo informará a Act1
. El problema es que estoy comenzando una nueva actividad usando Intent, así que ¿cómo Act1 se asignará como oyente a la interfaz de Act2?
Act1.java
- No se puede sobrecargar el método en la interfaz AIDL
- Android: varias actividades que comparten código común
- Análisis de GSON con Retrofit analizando la respuesta Flickr JSON
- Tener errores de emulador al intentar ejecutar actividad de mapa predeterminada en Android studio
- El desarrollo de Android cambia la visibilidad de TextView
public class Act1 extends ActionBarActivity implements ActionBar.OnNavigationListener { ActionBar actionbar; Intent pizzaIntent; boolean visibleFirstTime = true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.menutab); //set actionbar here } @Override public boolean onNavigationItemSelected(int arg0, long arg1)// item pos, // itemid { switch (arg0) { case 0: if(this.visibleFirstTime == false) { if(pizzaIntent == null) { pizzaIntent = new Intent(this,Act2.class); //how to call setChangeListener? } startActivity(pizzaIntent); } else this.visibleFirstTime = false; break; case 1: System.out.println("selected: " + arg0); break; case 2: System.out.println("selected: " + arg0); break; case 3: System.out.println("selected: " + arg0); break; default: break; } return true; } }
Act2.java
public class Act2 extends Activity { selectionChangeListener listener; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pizza_slice_selection); } public void setChangeListener(selectionChangeListener listener) { this.listener = listener; } private interface selectionChangeListener { public void selectionMadeAtIndex(int index); } }
Nota: Por favor, no me sugiera que use fragmentos. Quiero usar actividades actualmente.
- AudioTrack sólo reproducirá audio una vez
- Error: Gradle: la ejecución falló para la tarea ': app: preDexDebug'
- Función User.getUserId () en el punto final de nube api devuelve null para un objeto de usuario que no es nulo
- ¿Dónde encuentro proguard.cfg en mi proyecto?
- Colocación de varias tablas / columnas en un archivo CSV
- Cómo implementar un oyente de clic largo y onclicklistener en listview único
- Android: Haciendo código simple. SECO
- ¿Existen bibliotecas similares al proyecto Three20 para Android?
¿Ha considerado utilizar LocalBroadcastManager ?
En el acto de Act1:
act2InitReceiver= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // do your listener event stuff } }; LocalBroadcastManager.getInstance(this).registerReceiver(act2InitReceiver, new IntentFilter("activity-2-initialized"));
En la Ley de Act1:
LocalBroadcastManager.getInstance(this).unregisterReceiver(act2InitReceiver);
En Act2's onCreate:
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("activity-2-initialized"));
Déme un comentario si el código no compila, lo estoy escribiendo a mano.
Yo sugeriría crear una clase de modelo . Dejame darte un ejemplo:
Clase del modelo:
public class CustomModel { public interface OnCustomStateListener { void stateChanged(); } private static CustomModel mInstance; private OnCustomStateListener mListener; private boolean mState; private CustomModel() {} public static CustomModel getInstance() { if(mInstance == null) { mInstance = new CustomModel(); } return mInstance; } public void setListener(OnCustomStateListener listener) { mListener = listener; } public void changeState(boolean state) { if(mListener != null) { mState = state; notifyStateChange(); } } public boolean getState() { return mState; } private void notifyStateChange() { mListener.stateChanged(); } }
Y aquí está cómo usted utilizaría esto:
// Imports public class MainActivity extends Activity implements OnCustomStateListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomModel.getInstance().setListener(this); boolean modelState = CustomModel.getInstance().getState(); Log.d(TAG, "Current state: " + String.valueOf(modelState)); Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); } @Override public void stateChanged() { boolean modelState = CustomModel.getInstance().getState(); Log.d(TAG, "MainActivity says: Model state changed: " + String.valueOf(modelState)); } }
Cambio del estado miembro en la segunda actividad:
// Imports public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CustomModel.getInstance().changeState(true); } }
Salida LogCat:
Current state: false
MainActivity says: Model state changed: true
La forma más fácil es utilizar objetos estáticos, como esto:
class Act1 extends Activity { static String msg1 = "Hi"; } class Act2 extends Activity { String msg2; public onCreate() { msg2 = Act1.msg1; } }
Evitar la complejidad, mantenerlo simple y estúpido.