StackedWidget 视图未显示

Posted

技术标签:

【中文标题】StackedWidget 视图未显示【英文标题】:StackedWidget views not showing 【发布时间】:2014-07-07 12:43:51 【问题描述】:

当我的 StackedWidget 视图只是一个 textview 时,它会显示在启动器屏幕上,但布局更复杂(A RelativeLayout、imageview、textviews)它不会显示任何内容

关于设置 RemoteViews 有什么我需要知道的吗?

widget_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_item"
android:layout_
android:layout_>

<ImageView
    android:id="@+id/timelineCellImage"
    android:layout_
    android:layout_
    android:clickable="true"
    android:onClick="onClick"
    android:scaleType="centerCrop"
    android:src="@drawable/bottom_grey_gradient"
   />

<LinearLayout
    android:id="@+id/timelineCellTextHolder"
    android:layout_
    android:layout_
    android:layout_alignBottom="@id/timelineCellImage"
    android:layout_alignLeft="@id/timelineCellImage"
    android:background="@drawable/rounded_edges_bottom_dark"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        android:layout_
        android:layout_
        android:layout_marginLeft="@dimen/five_dp"
        android:layout_marginRight="@dimen/five_dp"
        android:layout_marginTop="@dimen/ten_dp"
        android:layout_weight=".5"
        android:ellipsize="end"
        android:gravity="bottom"
        android:lines="1"
        android:text="Test"
        android:textColor="@color/white"
        android:textSize="@dimen/twelve_sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/subheading"
        android:layout_
        android:layout_
        android:layout_marginBottom="@dimen/ten_dp"
        android:layout_marginLeft="@dimen/five_dp"
        android:layout_marginRight="@dimen/five_dp"
        android:layout_weight=".5"
        android:ellipsize="end"
        android:gravity="top"
        android:lines="1"
        android:text="Subtest"
        android:textColor="@color/white"
        android:textSize="@dimen/twelve_sp" />
</LinearLayout>

StackWidgetService.java $getViewAt(int)

public RemoteViews getViewAt(int position) 
    // position will always range from 0 to getCount() - 1.
    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
    if(!mWidgetItems.isEmpty())
        // We construct a remote views item based on our widget item xml file, and set the
        // text based on the position.

        rv.setTextViewText(R.id.title, mWidgetItems.get(position).getTitle()); //probably only top stories items, editorial stuff
        rv.setTextViewText(R.id.subheading, mWidgetItems.get(position).getLinkAbstract());
        rv.setImageViewUri(R.id.timelineCellImage, Uri.parse(mWidgetItems.get(position).getCoverImageUrl()));

        // Next, we set a fill-intent which will be used to fill-in the pending intent template
        // which is set on the collection view in StackWidgetProvider.
        Bundle extras = new Bundle();
        extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
        Intent fillInIntent = new Intent();
        fillInIntent.putExtras(extras);
        rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);

        // You can do heaving lifting in here, synchronously. For example, if you need to
        // process an image, fetch something from the network, etc., it is ok to do it here,
        // synchronously. A loading view will show up in lieu of the actual contents in the
        // interim.
        /*new ImageRequest(
                url,
                listener,
                maxWidth,
                maxHeight,
                decodeConfig,
                errorListener);

        Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() 
            @Override
            public void onResponse(Bitmap bitmap) 
                // use your bitmap
            
        ;*/

    
    else
    
        rv.setTextViewText(R.id.title, "my title"); 
        rv.setTextViewText(R.id.subheading, "");
        rv.setImageViewResource(R.id.timelineCellImage, R.drawable.top_grey_gradient);

        Bundle extras = new Bundle();
        extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
        Intent fillInIntent = new Intent();
        fillInIntent.putExtras(extras);
        rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
    

    try 
        System.out.println("Loading view " + position);
        Thread.sleep(500);
     catch (InterruptedException e) 
        e.printStackTrace();
    

    // Return the remote views object.
    return rv;

【问题讨论】:

分享xml布局和用于将膨胀布局添加到RemoteView的代码。 @ManishMulimani 好的,已添加。 getCoverImageUrl 是否返回内容 URI? setImageViewUri 适用于内容 URI 而不是网络资源。如果您使用网络资源,则需要设置位图。还要从布局文件中删除 ImageView 的 onClickclickable 属性。 【参考方案1】:

如果您使用的是本地图像,请使用RemoteViews.setImageViewUri

String url = new File(mWidgetItems.get(position).getCoverImageUrl()).toString();
rv.setImageViewUri(R.id.timelineCellImage, Uri.parse(url));

如果您正在使用网络资源,请使用RemoteViews.setImageViewBitmap

   Bitmap bm = getImageBitmap(mWidgetItems.get(position).getCoverImageUrl());
   rv.setImageViewBitmap(R.id.timelineCellImage, bm);

   // Helper method to get Image bitmap
   private Bitmap getImageBitmap(String purl) 
        Bitmap bm = null;
        try 
            URL url = new URL(purl);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();
            try 
                InputStream in = new BufferedInputStream( urlConnection.getInputStream() );
                bm = BitmapFactory.decodeStream(in);
             finally 
                urlConnection.disconnect();
            
         catch (MalformedURLException e1) 
            e1.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
         

        return bm;
    

ImageView 中删除clickableonClick 属性。 onClick 属性导致添加 setOnClickListener。你可以参考我之前写的这个answer。如果你想在远程视图的情况下处理ImageView上的点击事件,你应该使用RemoteViews.setOnClickPendingIntent。

【讨论】:

也许,这是可能的,但我想我只需要从我的 stackwidget 重新开始,即使删除图像组件仍然不会再渲染小部件单元格。而且我以前至少可以显示文字 @CQM 使用 Android 示例应用程序和您共享的代码,我能够显示图像。我已将我的项目提交给git repository。你可以试一试。 如何在小部件的线程中进行此网络调用,我尝试将位图分配放在线程中并将这些位图保存到哈希图中,但没有运气将它们设置为键跨度>

以上是关于StackedWidget 视图未显示的主要内容,如果未能解决你的问题,请参考以下文章

视图设计未显示在 ViewController 中

表格视图未正确显示

登录模式视图未显示在拆分视图上

Android - 为啥 Recycler 视图未显示在设备上? .我认为我的代码是正确的,但视图没有显示

为啥未显示集合可重用视图?

Swift - 表视图未填充数据但未显示错误