使用接口将数据从片段发送到活动



这是我试图从中获取信息的对话片段。我在这里放了两个数字选择器,并希望将数字发送到活动。一切都有效,直到我们到达我尝试发送数字(即数字和数字(的地步。在单击我的按钮时:

GrupoActivity ga=(GrupoActivity)getActivity();
ga.getDiceData();
dismiss();

与我尝试使用的接口相关的方法:

@Override
public int[] getData() {
int[] retorno=new int[2];
retorno[0]=numerocaras;
retorno[1]=numerodados;
return retorno;
}

另一方面,在我的活动上,我希望数据返回:

private void fragmentnumberpickermanager(){GrupoActivity obj=new GrupoActivity();
onDiceSelectedListener dsl=new NumberPickerDialog();
obj.registeronDiceSelectedListener(dsl);
obj.getDiceData();}
public void getDiceData() {
Log.w(TAG,"Dentro de getdicedata");
if (this.dsl != null) {
// invoke the callback method of class NumberPickerDialog
int[] carasydados=dsl.getData();
caras=carasydados[0];
numeroDados=carasydados[1];
}}   
public void registeronDiceSelectedListener(onDiceSelectedListener dsl)
{
this.dsl = dsl;
}
public interface onDiceSelectedListener{
int[] getData();
}

以防万一我忘记了一些重要的事情,两个完整的课程。这里是对话片段。

package com.jllf.clase.tiradaabierta;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.NumberPicker;
import android.widget.Toast;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
public class NumberPickerDialog extends DialogFragment implements GrupoActivity.onDiceSelectedListener{
Context context;
Button bt;
int numerocaras,numerodados;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

context=getContext();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater li = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate our custom layout for the dialog to a View
View view = li.inflate(R.layout.fragment_number_picker, null);
// inform the dialog it has a custom View
builder.setView(view);
NumberPicker numberPicker = (NumberPicker) view.findViewById(R.id.numDados);
NumberPicker numberPicker1= (NumberPicker) view.findViewById(R.id.numCaras);
numberPicker.setMinValue(1);
numberPicker.setMaxValue(30);
numberPicker1.setMinValue(1);
numberPicker1.setMaxValue(1000);
bt=(Button)view.findViewById(R.id.fragmentOk);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(view.getId()==R.id.fragmentOk){
try {
numerocaras= numberPicker1.getValue();
numerodados=numberPicker.getValue();
GrupoActivity ga=(GrupoActivity)getActivity();
ga.getDiceData();
dismiss();
} catch (ClassCastException cce) {cce.printStackTrace();
dismiss();}
}else {
dismiss();
Toast.makeText(getActivity(),"cancelled", Toast.LENGTH_LONG).show();
}
}
});

return builder.create();

}

@Override
public int[] getData() {
int[] retorno=new int[2];
retorno[0]=numerocaras;
retorno[1]=numerodados;
return retorno;
}
}

这里是我想要数据的活动。

package com.jllf.clase.tiradaabierta;
import android.app.Activity;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.NumberPicker;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.*;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.time.LocalDateTime;
import java.util.Random;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentTransaction;
//todo comprobar si extender de fragmentActivity rompe algo
public class GrupoActivity extends FragmentActivity{
private DatabaseReference mDatabase;
Mensajes men;
Button bt,bt1,bt2,of;
String TAG="GRP";
String nombreGrupo;
String mensaje;
String[] poblador;
ArrayList<String> al=new ArrayList<String>();
ListView lv;
EditText et,et1;
int resultado;
Random r=new Random();
int numeroDados=0, caras=0;
Date currentTime;
String resultados;
public static final String DATE_FORMAT_1 = "yyyy-MM-dd HH:mm:ss";
onDiceSelectedListener dsl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grupo);
//Recuperamos el nombre de grupo y situamos la referencia de la base de datos en el grupo
Bundle bundle = this.getIntent().getExtras();
nombreGrupo=bundle.getString("Grupo");
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase=mDatabase.child("Grupos").child(nombreGrupo);
of=(Button)findViewById(R.id.openfragment);
of.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragmentnumberpickermanager();
}
});
ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot grupos) {
// Get Post object and use the values to update the UI
Log.i(TAG,"ValueEventListener postListener Trigged "+grupos);
comprobarMensajes(grupos);
poblarListView();
botonBorrar(grupos);
// ...
}

@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
};
mDatabase.addValueEventListener(postListener);
bt=(Button)findViewById(R.id.btnAceptar);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tirardados();
}
});
bt1=(Button)findViewById(R.id.btnSalir);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//boton salir
mDatabase.child("miembros").equalTo(FirebaseAuth.getInstance().getCurrentUser().getEmail()).addListenerForSingleValueEvent((new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
dataSnapshot.getRef().removeValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}));
}
});


}
private void fragmentnumberpickermanager(){
//todo crear el numberpickerdialog y obtener el numero de dados y el numero de caras
//interfaz odsl
GrupoActivity obj=new GrupoActivity();
onDiceSelectedListener dsl=new NumberPickerDialog();
obj.registeronDiceSelectedListener(dsl);
obj.getDiceData();
//fin interfaz
DialogFragment nmbpckdlg=new NumberPickerDialog();
FragmentManager ft=getSupportFragmentManager();
nmbpckdlg.show(ft,TAG);
}
public void getDiceData() {
Log.w(TAG,"Dentro de getdicedata");
if (this.dsl != null) {
// invoke the callback method of class NumberPickerDialog
int[] carasydados=dsl.getData();
caras=carasydados[0];
numeroDados=carasydados[1];
}
}
public void registeronDiceSelectedListener(onDiceSelectedListener dsl)
{
this.dsl = dsl;
}
private void tirardados() {
// tirar dados y crear mensaje
resultados="";

for(int i = 0; i< numeroDados; i++){
resultado = r.nextInt(caras)+1;
resultados=resultados+resultado+", ";
}
if(resultados.length()>=2){
resultados.substring(0,resultados.length()-2);
mostrarResultado();
mensaje=FirebaseAuth.getInstance().getCurrentUser().getEmail()+" ha realizado una tirada de . Ha tirado "+numeroDados+" dado/s de "+caras+" caras. Los resultados han sido "+resultados+".";
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_1);
currentTime = Calendar.getInstance().getTime();
String timeformat=dateFormat.format(currentTime);
Mensajes men=new Mensajes(FirebaseAuth.getInstance().getCurrentUser().getEmail(),currentTime.toString(),mensaje);
mDatabase.child("mensajes").child(timeformat).setValue(men);}
else {
Toast toast=
Toast.makeText(getApplicationContext(),"Error al tirar el dado",Toast.LENGTH_SHORT);
}
}
//todo comprobar si esto funciona porque no creo
private void mostrarResultado() {
DialogFragment diceDialog=DiceDialog.newInstance(resultados);
FragmentManager fm= getSupportFragmentManager();
diceDialog.show(fm,TAG);
}

private void botonBorrar(DataSnapshot grupos) {
//
//boton borrar
View b2=findViewById(R.id.btnBorrar);
bt2=(Button)findViewById(R.id.btnBorrar);
for (DataSnapshot grupo : grupos.getChildren()){
if (grupo.getKey().equals("administrador")){
if (grupo.getValue().toString().equals(FirebaseAuth.getInstance().getCurrentUser().getEmail())){
b2.setVisibility(View.VISIBLE);
}
}
}
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDatabase.setValue(null);
}
});
}
private void comprobarMensajes(DataSnapshot grupo) {

for (DataSnapshot contenidogrupo:grupo.getChildren()){
if (contenidogrupo.getKey().equals("mensajes"))
for (DataSnapshot mensajes:contenidogrupo.getChildren()){
for (DataSnapshot mensaje:mensajes.getChildren())
//comprobamos si la clave de la pareja clave-valor es "mensaje" para saber si estamos en el atributo del objeto mensaje de tipo mensajes
//para diferenciarlo de otros atributos como autor o tiempo
{
if(mensaje.getKey().equals("mensaje")){
al.add(mensaje.getValue().toString());
}
}
}
}}


private void poblarListView() {
poblador=al.toArray(new String[0]);
ArrayAdapter<String> adaptador =
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, poblador);
lv= findViewById(R.id.listView);
lv.setAdapter(adaptador);
}
public interface onDiceSelectedListener{
int[] getData();
}
}

我建议从安卓开发者网站上查看本指南。

但是,我将忽略您的大部分代码,并提供有关如何执行标题要求的简短摘要">使用接口将数据从片段发送到活动">

对话框/片段的类应如下所示:


public class NumberPickerDialog extends DialogFragment {
private SomethingSelectedListener listener;
public interface SomethingSelectedListener {
void numbersSelected(int[] numbers);
}
...
@Override
public void onAttach(Context context) {
super.onAttach(context);
listener = (SomethingSelectedListener) context;
}
}

然后,要接收数据的活动应如下所示:

public class GrupoActivity extends FragmentActivity implements NumberPickerDialog.SomethingSelectedListener {
...
@Override
public void numbersSelected(int[] numbers) {
//Do stuff with your data
}
}

然后,一旦用户确认他们的选择,您只需要调用listener.numbersSelected(YOUR_NUMBERS);

最新更新