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

时间:2019-12-06 20:51:44

标签: java android android-fragments interface dialogfragment

这是我试图从中获取信息的DialogFragment。我在这里放入了两个NumberPickers,并希望将数字发送到Activity。一切正常,直到我们到达尝试发送数字的位置(数字和数字)。在我的按钮的onClick上:

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

以防万一我忘记了一些重要的东西,都是全班的。这里是DialogFragment。

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

1 个答案:

答案 0 :(得分:0)

我建议从android开发人员网站中检出this guide

但是,我将忽略您的大多数代码,并提供标题如下的简短摘要:“ 使用接口将数据从片段发送到活动”

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


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);