onfragmentinteractionlistener - navigation drawer con fragments android studio
ComunicaciĆ³n Fragmento-Fragmento en Android (7)
La comunicación entre dos fragmentos siempre debe ser a través de su actividad de fragmentación para mantener un acoplamiento flexible entre los fragmentos, de modo que si desea enviar algunos datos de un fragmento A a otro fragmento B puede crear oyente e implementarlo en su actividad de fragmento y desde el interior del fragmento A puedes disparar el evento usando ese oyente y enviar datos a la actividad del fragmento, entonces ahora la actividad del fragmento también tendrá el objeto del fragmento B y la actividad del fragmento puede llamar directamente al método del fragmento B y enviar datos al fragmento B ...
Estoy en el nivel de principiante en la programación de Android, así que necesito tu ayuda sincera para esto. Alguien me ayude por favor.
Estoy intentando construir una interfaz de usuario DESLIZANTE utilizando fragmentos
así que mi duda real es ... Tengo un Fragment
(digamos el Fragment
A) que tiene una TextView
y un Button
en él y otro Fragment
(digamos el Fragment
B). Tiene un TextView
en él. Necesito mostrar el contenido de TextView
del Fragment A
en TextView
del Fragment A
, cuando presioné el Button
en FRAGMENT A. Intenté de muchas maneras, desafortunadamente no obtuve el resultado adecuado. Estoy seguro de que la gente lo sabe. Por favor, ayúdame.
Gracias
Se debe hacer el oyente pensado, por lo que los fragmentos aún no dependen el uno del otro y se pueden usar en uno o dos modos de panel. La actividad debe manejar a los oyentes de ambos fragmentos.
Aquí hay un ejemplo de actividad con dos Fragmentos:
package com.example;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import com.example.fragment.FragmentA;
import com.example.fragment.FragmentA.TextChangeListener;
import com.example.fragment.FragmentB;
public class ActivityAB extends FragmentActivity {
FragmentA fragmentA;
FragmentB fragmentB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ab);
FragmentManager manager = getSupportFragmentManager();
fragmentA = (FragmentA) manager.findFragmentById(R.id.fragmentA);
fragmentB = (FragmentB) manager.findFragmentById(R.id.fragmentB);
fragmentA.setTextChangeListener(new TextChangeListener() {
@Override
public void onTextChange(CharSequence newText) {
fragmentB.updateTextValue(newText);
}
});
}
}
Aquí está el Fragmento A, que tiene un oyente personalizado para el evento de cambio de texto.
package com.example.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.R;
public class FragmentA extends Fragment {
TextChangeListener listener;
public interface TextChangeListener {
public void onTextChange(CharSequence newText);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a, container, false);
Button btn = (Button) view.findViewById(R.id.button1);
final TextView textView = (TextView) view.findViewById(R.id.textView1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (null != listener) {
listener.onTextChange(textView.getText());
}
}
});
return view;
}
public void setTextChangeListener(TextChangeListener listener) {
this.listener = listener;
}
}
Aquí está el Fragmento B que tiene un método público para actualizar el campo de texto:
package com.example.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.R;
public class FragmentB extends Fragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_b, container, false);
textView = (TextView) view.findViewById(R.id.textView1);
return view;
}
public void updateTextValue(CharSequence newText) {
textView.setText(newText);
}
}
Diseño ActivityAB xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal" >
<fragment
android:id="@+id/fragmentA"
android:name="com.example.fragment.FragmentA"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/fragmentB"
android:name="com.example.fragment.FragmentB"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
Fragmento Un diseño xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show" />
</LinearLayout>
Fragmento B xml diseño:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(here will be text)"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
Este tutorial funciona bien para mí.
http://laaptu.wordpress.com/tag/android-passing-data-from-activity-to-fragment/
Disfrutar
Suena como si su configuración pudiera ser algo así como: MainActivity con FragmentA [added] y FragmentB [added]. Para este caso, delegaría mensajes / acciones entre los dos fragmentos a través de MainActivity. Permitir que MainActivity maneje los mensajes / acciones también facilita orquestaciones ''especiales'' que podrían ser necesarias en una situación más compleja entre los Fragmentos. Por ejemplo:
public interface FragmentCommunicator
{
public void sendMessage ( String broadcastMessage );
public void takeAction ( String name, int action, Fragment frag );
}
public class MainActivity extends Activity implements FragmentCommunicator
{
Fragment fragA;
Fragment fragB;
...
@Override
public void sendMessage ( String msg )
{
if ( msg.Contains("Send To fragA") )
fragA.receiveMsg(msg);
...
}
@Override
public void takeAction ( String name, int action, Fragment frag )
{
if ( action == CLOSE )
removeFragment( name, frag );
...
}
}
public class FragmentA extends Fragment
{
...
@Override
public void onClick(View v)
{
FragmentCommunicator inter = (FragmentCommunicator) getActivity();
inter.sendMessage("the txt/information/etc you want to send to fragB");
}
}
public class FragmentB extends Fragment
{
...
public void receiveMsg ( String msg )
{
textView.setText(msg);
}
}
Olvidé publicar la porción de envío de FragmentA. Espero que esto ayude.
developer.android.com
Para permitir que un Fragmento se comunique con su Actividad, puede definir una interfaz en la clase Fragmento e implementarla dentro de la Actividad. El Fragmento captura la implementación de la interfaz durante su método de ciclo de vida onAttach () y luego puede llamar a los métodos de la Interfaz para comunicarse con la Actividad.
Ejemplo : - http://wiki.workassis.com/android-fragment-communication/
ref: - https://developer.android.com/training/basics/fragments/communicating.html
De hecho, es bastante fácil, solo sigue estos pasos:
- Entonces creó los dos fragmentos A y B, ahora crea sus cerebros, es decir, los archivos de clase Java. Vamos a llamarlos JClass A (para el Fragmento A) y JClass B (para el Fragmento B)
2. Tienes el botón en el Frag A, así que ve a JClass A, y en eso obtén el texto String que el usuario escribe y el botón presiona un evento como este: // simplemente anula el método onCreate.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.<name of your fragment A.xml file>,container,false);
userInput = (EditText)view.findViewById(R.id.<Id that you gave to EditText field in which user enters text>);
Button myButton = (Button)view.findViewById(R.id.<id of your Button>);
myButton.setOnClickListener(
new Button.OnClickListener(){
public void onClick(View v){
JClassB.setText(userInput.getText().toString());/*Replace JClassB with the java class of Fragment B*/
}
}
);
return view;
}
Y finalmente en su JClass B (archivo java para el fragmento B):
clase pública BottomSectionFrag extends Fragment {
private static TextView userText; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentB, container, false); userText = (TextView)view.findViewById(R.id.userText); return view; } public static void setText(String text){ userText .setText(text); }
}
Voila !!
PD Esta es mi primera publicación en : D
Tranquilízate.
Me gusta que la actividad sea el intermediario entre fragmentos para fragmentar la comunicación. pero la otra cosa que me gusta es utilizar una arquitectura de bus de eventos que también ofrece desacoplamiento.