在 Fragment 中实现接口

Jer*_*her 1 android android-fragments

我正在尝试在不同的片段中重用 Dialog。我的应用程序的结构是一个在多个片段之间转换的活动。

我在 DialogFragment 中定义了一个侦听器接口,然后在我想在其中使用它的片段中实现了该接口。这是不同的片段在积极点击方面显示不同的行为。这是对话框片段

public class AreyouSureDialog extends DialogFragment {
    public ConfirmationListener listener;
    public interface ConfirmationListener {
        public void onPositiveClick(DialogFragment dialog);
        public void onNegativeClick(DialogFragment dialog);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        builder.setView(inflater.inflate(R.layout.confirmation_dialog, null))
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        listener.onPositiveClick(AreyouSureDialog.this);
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        listener.onNegativeClick(AreyouSureDialog.this);
                    }
                });
        // Create the AlertDialog object and return it
        return builder.create();
    }



    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (ConfirmationListener) context;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我实现的片段 onPositiveClick

public class Profile extends Fragment implements AreyouSureDialog.ConfirmationListener {

    SharedPreferences pref;
    public static final String pref_filename = "ProfilePreferences";
    ImageView profile_pic;
    Bitmap bitmap;
    String sTargetUri;
    Uri targetUri;

    public UpdateClickListener listener;

    View view;

    String name;
    String user_name;
    String email;

    public interface UpdateClickListener {
        public void onUpdateClick(String name, String user, String email);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.profile, container, false);

        profile_pic = (ImageView) view.findViewById(R.id.img_pic);
        final EditText et_name = (EditText) view.findViewById(R.id.et_name);
        final EditText et_user = (EditText) view.findViewById(R.id.et_username);
        final EditText et_email = (EditText) view.findViewById(R.id.et_email);
        EditText et_description  = (EditText) view.findViewById(R.id.et_description);

        Button btUpdate = (Button) view.findViewById(R.id.bt_update);

        //profile_pic.setImageBitmap();

        pref = getActivity().getSharedPreferences(pref_filename, 0);
        if(!(pref == null))
        {
            sTargetUri = pref.getString("target_uri", "default");
            name = pref.getString("name", "John Doe");
            user_name = pref.getString("username", "John Doe");
            email = pref.getString("email", "John Doe@gmail.com");

        }
        if(sTargetUri.equals("default"))
        {
            profile_pic.setImageResource(R.drawable.ic_menu_camera);
        }
        else
        {
            targetUri = Uri.parse(sTargetUri);
            try {
                bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(targetUri));
                profile_pic.setImageBitmap(bitmap);
            } catch (FileNotFoundException e){

            }
        }

        et_name.setText(name);
        et_user.setText(user_name);
        et_email.setText(email);

        profile_pic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 0);
            }
        });

        btUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                String tempName = et_name.getText().toString();
                String tempUserName = et_user.getText().toString();
                String tempEmail = et_email.getText().toString();
                listener.onUpdateClick(tempName, tempUserName, tempEmail);
                */
                showDialog();
            }
        });

        return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK){
            targetUri = data.getData();
            //Bitmap bitmap;
            try {
                bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(targetUri));
                SharedPreferences.Editor edit = pref.edit();
                edit.putString("target_uri", targetUri.toString());
                edit.apply();
                profile_pic.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (UpdateClickListener) context;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getActivity().setTitle("Profile");
    }

    @Override
    public void onPositiveClick(DialogFragment dialog) {
        System.out.println("hello");
    }

    @Override
    public void onNegativeClick(DialogFragment dialog) {

    }

    public void showDialog()
    {
        DialogFragment fragment = new AreyouSureDialog();
        fragment.show(getActivity().getSupportFragmentManager(), "dialog");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我单击肯定按钮时,出现以下错误:

java.lang.ClassCastException: com.example.myname.finalapp.MainActivity cannot be cast to com.example.myname.finalapp.AreyouSureDialog$ConfirmationListener
                                                                                   at com.example.myname.finalapp.AreyouSureDialog.onAttach(AreyouSureDialog.java:49)
Run Code Online (Sandbox Code Playgroud)

cri*_*007 5

您将通过您的方法获得对 Activity 的回调。Activity 需要实现该接口。

如果这不是你想要的,你无论如何都要调用构造函数。

new AreyouSureDialog();
Run Code Online (Sandbox Code Playgroud)

因此,添加另一个以接受侦听器

public AreyouSureDialog() {} 

public AreyouSureDialog(ConfirmationListener listener) {
    this.listener = listener;
} 
Run Code Online (Sandbox Code Playgroud)

现在你可以使用

new AreyouSureDialog(Profile.this);
Run Code Online (Sandbox Code Playgroud)

setter 方法也可以

/* @Override
public void onAttach(Context context) {
    super.onAttach(context);
    listener = (ConfirmationListener) context;
} 
*/

public void setConfirmationListener(ConfirmationListener listener) {
    this.listener = listener;
} 
Run Code Online (Sandbox Code Playgroud)