【问题标题】:Invoking a method in a fragment through a LocalBroadcastManager通过 LocalBroadcastManager 调用片段中的方法
【发布时间】:2019-07-05 04:48:37
【问题描述】:

我正在构建一个包含 2 个片段的应用。

  • 第一个片段:ImageView 和 2 个 TextViews
  • 第二个片段:2 个编辑文本和 3 个按钮

在第二个片段中,我有一个“保存”按钮。在此按钮的onClick 中,我正在尝试发送本地广播:

btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                localBroadcastManager.sendBroadcast(localIntent);
            }
        });

这是我的意图:

 final LocalBroadcastManager localBroadcastManager = LocalBroadcastManager
                .getInstance(Objects.requireNonNull(getContext()));

        final Intent localIntent = new Intent("CUSTOM_ACTION");

这样做的目的是让第一个片段拾取它并执行一个方法将图像保存为带有标题的位图(这就是 2 个 TextView 的用途)。这是我的尝试:

private BroadcastReceiver listener = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent ) {
            String data = intent.getStringExtra("DATA");
            Toast.makeText(context, data + " received", Toast.LENGTH_SHORT).show();

            createAndSaveBitmap(topTextView.getText().toString(), bottomTextView.getText().toString(), memeBitmap, memeCanvas, memePaint, imageView, imageUri);
        }
    };

    public void createAndSaveBitmap(String top, String bottom, Bitmap bitmap,
                                    Canvas canvas, Paint paint, ImageView imageView, Uri imageUri) {

        try {
            memeBitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(imageUri))
                    .copy(Bitmap.Config.ARGB_8888, true); }

        catch (FileNotFoundException e) { e.printStackTrace(); }

        canvas = new Canvas(memeBitmap);

        paint = new Paint();

        canvas.drawText(top, 0, 0, paint);
        canvas.drawText(bottom, 0, memeCanvas.getHeight() - 10, paint);

        imageView.setImageBitmap(memeBitmap);

        if(bitmap != null){
            File file = Environment.getExternalStorageDirectory();
            File newFile = new File(file, "test.jpg");

            try {
                FileOutputStream fileOutputStream = new FileOutputStream(newFile);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
                fileOutputStream.flush();
                fileOutputStream.close();
            }

            catch (FileNotFoundException e) {e.printStackTrace();}
            catch (IOException e) { e.printStackTrace(); }
        }
    }

当我运行应用程序时,单击“保存”按钮时没有任何反应。不下载图像,也不会崩溃。由于没有错误堆栈跟踪,我看不到哪里出错了。

【问题讨论】:

  • 是否调用了 onRecieve 方法?当它收到广播时,意图的内容是什么
  • @Brandon 我已经更新了我的答案。关于onReceive。当我单击第二个片段中的“保存”按钮时,我希望立即下载。因为这是我第一次使用 LBM,所以我不知道如何调用 onReceive

标签: android android-fragments broadcastreceiver android-broadcast localbroadcastmanager


【解决方案1】:

确保您在接收片段的onResume 中调用它。

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
        listener, 
        new IntentFilter("CUSTOM_ACTION")
);

这个在onPause

LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(listener);

【讨论】:

  • 我得到了unRegisterReceiver 部分,但为什么是第一个代码以及为什么在onResume 中?
  • 您需要注册接收器才能获得广播。为什么要在onResume 注册只是选项之一。这主要取决于您的应用程序的设计及其需求。我想这个讨论最好地描述了注册和注销接收器的所有情况:stackoverflow.com/q/8802157/6272369
  • Constants.INTENT_NEW_MESSAGE 在片段中无法识别。
  • 是的,你是对的。它应该是您作为动作赋予意图的确切字符串。我已经编辑了我的答案。
  • 我已经接受了你的回答,但由于我的代表级别,我还不能投票。如果您认为这是一个很好的问题,您能否也给我一个赞成票?
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多