【问题标题】:How to handle interface for onActivityResult Override Method如何处理 onActivityResult Override 方法的接口
【发布时间】:2019-05-24 12:06:18
【问题描述】:

我想在 Adapter 中使用 onActivityResult 方法,但在 Stack Overflow 上搜索后,我发现我必须为 onActivityResult 创建接口,但我不知道如何制作并处理 onActivityResult Methode 以根据我的需要工作。

这是我的适配器类。

    public class PosterAdapter extends RecyclerView.Adapter<PosterAdapter.PosterViewHolder> {


    private static final String TAG = "resPoster";
    private ArrayList<Poster> posterArrayList;
    private Context context;



    public PosterAdapter(ArrayList<Poster> posterArrayList, Context context) {
        this.posterArrayList = posterArrayList;
        this.context = context;
    }

    @NonNull
    @Override
    public PosterViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.sending_image_layout, viewGroup, false);

        return new PosterViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull PosterViewHolder posterViewHolder, int i) {

        posterViewHolder.imageViewDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                posterViewHolder.relativeLayoutImage.setDrawingCacheEnabled(true);

                Bitmap bitmap = Bitmap.createBitmap(posterViewHolder.relativeLayoutImage.getDrawingCache());
                posterViewHolder.relativeLayoutImage.setDrawingCacheEnabled(false);


                FileOutputStream outStream = null;
                File sdCard = Environment.getExternalStorageDirectory();
                File dir = new File(sdCard.getAbsolutePath() + "/providers");
                dir.mkdirs();
                String fileName = String.format("%d.jpg", System.currentTimeMillis());
                Log.d(TAG,"filename: " +  fileName);
                File outFile = new File(dir, fileName);
                Log.d(TAG,"outFile: " +  outFile);
                try {
                    outStream = new FileOutputStream(outFile);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
                    outStream.flush();
                    outStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });

        posterViewHolder.imageViewEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setType("image/*");
                i.setAction(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
//                startActivityForResult(i, 0);
                ((Activity) context).startActivityForResult(Intent.createChooser(i, "CHOOSING INTENT"), 0);
            }
        });



    }





    @Override
    public int getItemCount() {
        return posterArrayList.size();
    }

    public class PosterViewHolder extends RecyclerView.ViewHolder {

        RelativeLayout relativeLayoutImage;
        ImageView imageViewBg, imageViewEdit, imageViewDownload, imageViewShare;
        CircleImageView imageViewProfie;

        public PosterViewHolder(@NonNull View posterView) {
            super(posterView);

            relativeLayoutImage = posterView.findViewById(R.id.image_relative);
            imageViewBg = posterView.findViewById(R.id.image_bg);
            imageViewProfie = posterView.findViewById(R.id.image_profile_moving);
            imageViewEdit = posterView.findViewById(R.id.edit_image);
            imageViewDownload = posterView.findViewById(R.id.download_image);
            imageViewShare = posterView.findViewById(R.id.share_image);

        }
    }

}

我想使用这个类

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

    if (resultCode == RESULT_OK) {
        if (requestCode == 0) {
            final Uri selectedUri = data.getData();
            if (selectedUri != null) {
                startCrop(selectedUri);
            } else {
                Toast.makeText(context, "Cannot retrieve selected Image", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == UCrop.REQUEST_CROP) {
            handleCropResult(data);
        }
    }
    if (resultCode == UCrop.RESULT_ERROR) {
        handleCropError(data);
    }
}

请帮我在界面中处理这个方法。 谢谢。

**更新:**

这是我的活动代码,以了解更多我的问题。

     RequestQueue requestQueue;
    private ArrayList<Poster> posterArrayList = new ArrayList<>();
    private RecyclerView recyclerView;
    private PosterAdapter posterAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sending_image);

        requestQueue = Volley.newRequestQueue(this);

        recyclerView = findViewById(R.id.recycler_poster);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));


        getAllPoster();
    }

    private void getAllPoster() {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("poster_id", "1");

        Log.d(TAG + "pp", String.valueOf(params));




        String Url = Constants.Base_URL + "poster/";

        JsonObjectRequest request = new JsonObjectRequest(Url,  new JSONObject(params),
                response -> {
                    Log.d("responsePending", String.valueOf(response));

                    try {
                        String statusResponseObject = response.getString("status");
                        String msgObject = response.getString("msg");

                        if (statusResponseObject.equals("200")){

                            JSONArray jsonArray = response.getJSONArray("response");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject pendingFragResponse = jsonArray.getJSONObject(i);

                                String posterObject = pendingFragResponse.getString("poster");
                                String positionObject = pendingFragResponse.getString("position");
                                String sizeObject = pendingFragResponse.getString("size");
                                String txt_positionObject = pendingFragResponse.getString("txt_position");
                                String titleObject = pendingFragResponse.getString("title");
                                String descriptionObject = pendingFragResponse.getString("description");


                                //

                                posterArrayList.add(new Poster(posterObject, positionObject,
                                        sizeObject, txt_positionObject,
                                        titleObject, descriptionObject));
                                posterAdapter = new PosterAdapter( posterArrayList, SendingImageActivity.this);
                                recyclerView.setAdapter(posterAdapter);
//                                wp10ProgressBar.hideProgressBar();
//                                wp10ProgressBar.setVisibility(View.GONE);

                            }
                            posterAdapter.notifyDataSetChanged();
//                            wp10ProgressBar.hideProgressBar();
                        }else {
//                            wp10ProgressBar.hideProgressBar();
//                            wp10ProgressBar.setVisibility(View.GONE);
                            Toast.makeText(SendingImageActivity.this, msgObject, Toast.LENGTH_SHORT).show();
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();
                    }



                }, error -> {
            error.printStackTrace();
            Log.d(TAG + "error", String.valueOf(error.getMessage()));
            Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();

        });

        requestQueue.add(request);
    }




}


                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();
                    }



                }, error -> {
            error.printStackTrace();
            Log.d(TAG + "error", String.valueOf(error.getMessage()));
            Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();

        });

        requestQueue.add(request);
    }




}

【问题讨论】:

  • 必须在活动中实现 onActivityResult() 方法。当您开始一项新活动时,您将上下文转换为一个活动,该活动是接收 onActivityResult() 的活动。现在让该活动与适配器通信。
  • @juancamilo87 这是我的观点,我有一个适配器活动,但我无法与适配器通信。你能帮我做这个吗?这对我来说非常棒。
  • 不看活动代码就很难了。但简而言之,使适配器成为类中的一个属性,以便在 onActivityResult() 中您可以访问它而不必再次创建它。要进行通信,您可以在您直接访问的适配器中创建一个公共方法,或者使用接口在它们之间进行通信。
  • 等待我用我的活动更新我的答案。
  • @juancamilo87 兄弟我更新了我的答案。

标签: android android-intent interface adapter


【解决方案1】:

而不是使用Interface 模式,只需在适配器内部创建公共方法并在onActivityResult 命中Activity 时调用该方法。

(此答案只是您的方案的解决方法。理想情况下,您不应将活动 Context 传递给适配器,而不是使用 Interface 模式并在发生任何操作时在活动中接收回调(例如单击编辑按钮)在您的活动中并传递相关数据,同时从您的适配器触发回调。)

你可以参考AllNoteActivity和NoteAdapter参考here

【讨论】:

  • 对不起,兄弟,但我没有找到任何对我有用的东西,请您更新一下代码以了解更多信息。
  • 参考链接有一个非常直接的java代码,如果你了解接口,那么你一定会理解它。否则你应该学习 Java 中的接口模式
  • 兄弟在我的问题中,我清楚地提到我不了解界面。所以我在这里问。如果我知道接口,那么 stackOverflow 对我的问题有足够的答案。
  • 好的。因此,我建议您尝试学习我在之前的回复中提到的接口。
  • 对不起兄弟,我正在学习接口,但我没有足够的时间为公司完成这项工作
【解决方案2】:

所以你需要做的是把当前方法 onActivityResult() 从 PosterAdapter 放到活动中。然后将方法 startCrop()、handleCropResult() 和 handleCropError() 公开(我假设在 PosterAdapter 中)。

在 onActivityResult() 中将 startCrop() 的调用更改为 posterAdapter.startCrop()。其他方法也一样。应该这样做。

【讨论】:

  • 当我单击图像视图并从图库中获取图像并在图像视图上设置之后在 onActivity 结果方法中裁剪时,我想要。兄弟我不能照你说的做,因为所有的裁剪方法都取决于活动结果
  • 据我所知,您有一个活动,该活动有一个显示元素列表的适配器。单击项目时,将打开图像选择器。当用户选择图像时,将调用活动中的onActivityResult 信息。该信息现在可用于裁剪图像并将其放入适配器中。如果您需要将图像放入适配器中被点击的项目中,那么您需要跟踪点击的内容,以便之后选择它。
  • 我知道,按照同样的逻辑,我清楚地提到我无法实现我想用代码回答以查看如何实现。
【解决方案3】:

在适配器中创建一个方法

在你的适配器类中

    public void waterverYouWantMethod(){

}

当 onActivityResult 方法被调用时,从 Activity 调用该方法。

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

        if (resultCode == RESULT_OK) {
   // call that method here
adapter.wateverYouWantMethod();


    }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2010-09-17
    • 1970-01-01
    • 2010-11-02
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多