【问题标题】:How to get ImageView from Layout XML into BroadcastReceiver如何从 Layout XML 获取 ImageView 到 BroadcastReceiver
【发布时间】:2015-08-30 16:21:31
【问题描述】:

我在布局 XML 文件中的 ImageView 中定义了我的图像,如下所示:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:gravity="center"
    android:layout_margin="1dp"
    android:background="@drawable/bg">

<ImageView
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:id="@+id/imgId"
    android:src="@drawable/img1"/>
...
</RelativeLayout>

当我收到广播时,如何在我的 BroadCastReceiver 类中访问 ID 为 imgId 的 ImageView 对象?

public class MyIntentReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    ...
    }
}

有没有办法使用 RemoteViews 访问布局 XML 元素?

RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mylayout);

【问题讨论】:

    标签: android android-layout android-widget


    【解决方案1】:

    您似乎正在寻找一种方法来修改 App Widget 中的 View 对象。这不可能。但是,您可以使用 RemoteViews 对象来更改 ApWidget 中的视图。

    因此,在您的 BroadcastReceiver 中,您可以将一些值存储在 SharedPreferences(或任何其他将数据持久保存在磁盘上的方法)中,然后存储 force an update of your widget

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
    R.layout.example_appwidget);
    appWidgetManager.updateAppWidget(mAppWidgetId, remoteViews);
    

    然后在 AppWidgetProvider 的 onUpdate 函数中,您可以检查存储到 SharedPreferences 中的值并通过 RemoteViews 对象更改视图。例如,无法通过 RemotrViews 在图像上设置 ImageMatrix,但您可以调用 setRotation。

    remoteViews.setFloat(R.id.img1, "setRotation", 45.0);
    

    上一个答案:

    将所有数据放入 BroadcastReceiver 的方法是将数据包含在 Intent 中。

    Intent intent = new Intent(context, MyIntentReceiver.class);
    intent.putExtra(getPackageName() + ".ImageViewId", R.id.imgId);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent );
    

    当广播接收器接收到意图时,可以访问这些数据。

    public void onReceive(Context context, Intent intent) {
        int imgId = intent.getIntExtra(context.getPackageName() + ".ImageViewId", 0);
        ...
    }
    

    【讨论】:

    • 我的错。我编辑了我的问题。我的意思是问如何在我的广播接收器中检索 ImageView 对象。我需要像这样转换我的 ImageView:Matrix matrix=new Matrix(); imageView.setScaleType(ScaleType.MATRIX); matrix.postRotate((float) 30, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2); imageView.setImageMatrix(matrix); 为此,我需要访问 imageview 对象。
    • 嗯...在广播接收器中修改视图似乎有点奇怪;可能有更好的方法是在这里实现你的目标。无论如何,也许如果您的 BroacastReceiver 是 Activity 中的内部类,它可以访问 ImageView 成员。您的 RemoteViews 问题让我认为这可能适用于 App Widget,在这种情况下,您无法访问 App Widget 中的 ImageView。
    • 我没有使用活动。它是一个AppWidgetProvider,我在其中注册了我的接收器。即使在AppWidgetProvider 中,我也无法检索 ImageView 对象。
    【解决方案2】:

    我发现我可以旋转位图,然后将其设置为 imageview 的位图,而不是旋转 imageview。

    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.img);
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    updateViews.setImageViewBitmap(R.id.imgView, bitmap);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多