【问题标题】:Dialog.dismiss is not working inside in adapter classDialog.dismiss 在适配器类中不起作用
【发布时间】:2021-08-09 14:04:03
【问题描述】:

在我的代码中,dialog.dismiss(); 函数不工作,但回调函数工作正常,callback.onItemClicked(position);

请帮帮我,我是android领域的新手!

相同的代码在activity 中运行良好,但在adapter class 中出现问题。

适配器类

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    private final Context mContext;
    private final ArrayList<String> mData;
    AdapterCallback callback;
    Dialog dialog;


    public Adapter(Context mContext, ArrayList<String> mData, AdapterCallback callback) {
        this.mContext = mContext;
        this.mData = mData;
        this.callback = callback;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        if (Helper.readSharedPref(mContext, Constants.PREF_KEY_Sub).equalsIgnoreCase("notActive")) {
            if (!mData.get(position).equalsIgnoreCase("PENDING")) {
           alertSuccessShowDialog(mContext, position);
            }
        }
    }

    @Override
    public int getItemCount() {
        return mData != null ? mData.size() : 0;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    public interface AdapterCallback {
        void onItemClicked(int position);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView tv_bank_name;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_bank_name = itemView.findViewById(R.id.tv_bank_name);
        }
    }


    private void alertSuccessShowDialog(Context context, int position) {
        dialog = new Dialog(context);
        dialog.setContentView(R.layout.enquiry_popup);
        dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        dialog.getWindow().setGravity(Gravity.CENTER);
        dialog.setCancelable(false);
        dialog.findViewById(R.id.iv_close_btn).setOnClickListener(v -> {
            dialog.dismiss();
            callback.onItemClicked(position);
        });

        dialog.show();
    }

}

【问题讨论】:

    标签: android android-studio android-layout


    【解决方案1】:

    您的对话框方法代码没有问题,只需使用新的上下文更改这样的调用方法...

    alertSuccessShowDialog(holder.itemView.getContext(), position);
    

    【讨论】:

      【解决方案2】:

      @Dev4life 说的是对的,您必须在创建对话框后调用,并且我认为出于安全原因,您应该使用 AlertDialog 而不是 Dialog。文档中有关于以下内容的简短声明: Dialogs

      Dialog 类是对话框的基类,但你应该避免 直接实例化Dialog。而是使用以下方法之一 子类:

      AlertDialog 一个可以显示标题、最多三个按钮、一个 可选项目列表或自定义布局。 DatePickerDialog 或 TimePickerDialog 具有预定义 UI 的对话框,允许用户 选择日期或时间。

      这是我不知道的代码,但应该可以:

      public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
          
          private final Context mContext;
          private final ArrayList<String> mData;
          AdapterCallback callback;
          
          AlertDialog dialog;
          Button btnClose;
          AlertDialog.Builder builder;
      
          public Adapter(Context mContext, ArrayList<String> mData, AdapterCallback callback) {
              this.mContext = mContext;
              this.mData = mData;
              this.callback = callback;
          }
      
          public class ViewHolder extends RecyclerView.ViewHolder {
              
              TextView tv_bank_name;
      
              public ViewHolder(@NonNull View itemView) {
                  super(itemView);
                  tv_bank_name = itemView.findViewById(R.id.tv_bank_name);
              }
          }
      
          @NonNull
          @Override
          public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item, parent, false));
          }
      
          @Override
          public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      
              if (Helper.readSharedPref(mContext, Constants.PREF_KEY_Sub).equalsIgnoreCase("notactive")) {
                  if (!mData.get(position).equalsIgnoreCase("pending")) {
                 alertSuccessShowDialog(position);
                  }
              }
          }
      
          @Override
          public int getItemCount() {
              return mData != null ? mData.size() : 0;
          }
      
          @Override
          public int getItemViewType(int position) {
              return position;
          }
      
          public interface AdapterCallback {
              void onItemClicked(int position);
          }
      
          private void alertSuccessShowDialog(int position) {
              View view = LayoutInflater.from(mContext).inflate(R.layout.enquiry_popup, null, false);
              btnClose = view.findViewById(R.id.iv_close_btn);
      
              builder = new AlertDialog.Builder(mContext);
              builder.setView(view);
              
              dialog = builder.create();
              dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
              btnClose.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      callback.onItemClicked(position);
                      dialog.dismiss();
                  }
              });
              dialog.show();
          }
      }
      

      这是我最后的赌注,不知道如何解决。 为您的对话框创建一个类,如果需要,在构造函数中传递上下文。

      对话框类:

      public class DialogEnquiry extends DialogFragment {
              
              private AdapterCallback callback;
              private int position;
      
              public DialogEnquiry(AdapterCallback callback,int position){
                  this.callback = callback;
                  this.position = position;
              }
      
              @NonNull
              @Override
              public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
                  
                  View view = LayoutInflater.from(requireContext()).inflate(R.layout.enquiry_popup, null);
                  btnClose = view.findViewById(R.id.iv_close_btn);
                  btnClose.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          callback.onItemClicked(position);
                          dismiss();
                      }
                  });
      
                  return new AlertDialog.Builder(requireContext())
                  .setView(view)
                  .create();
              }
      
              @Override
              public void onStart() {
              super.onStart();
              getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
              }
          }
      

      在你的适配器内部,也许你需要在适配器中传递片段管理器,但我不知道这是否正确,我是 android 的新手:

      new DialogEnquiry(callback, position).show(fragmentManager, "dialog");

      这是我最后一次尝试,希望能给你一些启发。 祝你好运!

      【讨论】:

      • 当我按下按钮不起作用但当我按下 3 次时它工作不正常并关闭对话框。请解决这个问题...
      • 我改了代码,尝试改全局变量,而不是使用Dialog对话框;更改为 AlertDialog 对话框;
      • 对不起兄弟,现在它完全不工作了
      • 抱歉,我更改了位置按钮,因此在没有该方法的情况下创建了对话框。
      • 如果不工作!说它没有显示......或者只是没有正确显示,它是否给出了一些错误。
      【解决方案3】:

      您必须更改您的代码。因为您不能在显示之前关闭对话框。所以像这样改变你的代码。

      private void alertSuccessShowDialog(Context context, int position) {
              dialog = new Dialog(context);
              dialog.setContentView(R.layout.enquiry_popup);
              dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
              dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
              dialog.getWindow().setGravity(Gravity.CENTER);
              dialog.setCancelable(false);
              dialog.show();
              
              dialog.findViewById(R.id.iv_close_btn).setOnClickListener(v -> {
                  dialog.dismiss();
                  callback.onItemClicked(position);
              });
      }
      

      【讨论】:

      • 在显示一个对话框后我的关闭代码工作你错了对不起哥们!
      猜你喜欢
      • 2016-09-15
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2018-08-12
      • 2022-01-20
      相关资源
      最近更新 更多