Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

StackedWidget views not showing

When my StackedWidget view was only a textview, it displayed on the launcher screen, but with a more intricate layout (A RelativeLayout, imageview, textviews) it does not display anything

Is there something I need to know about setting RemoteViews ?

widget_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_item"
android:layout_width="270dp"
android:layout_height="150dp">

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

<LinearLayout
    android:id="@+id/timelineCellTextHolder"
    android:layout_width="match_parent"
    android:layout_height="@dimen/fifty_dp"
    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_width="wrap_content"
        android:layout_height="0dp"
        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_width="wrap_content"
        android:layout_height="0dp"
        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;
}
like image 286
CQM Avatar asked May 19 '14 13:05

CQM


1 Answers

If you are using local image, use RemoteViews.setImageViewUri.

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

If you are using network resource, use 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;
    }

Remove clickable and onClick attributes from ImageView. onClick attribute results in adding setOnClickListener. You can refer to this answer I had written earlier. If you want to handle click event on ImageViewin case of remote views, you should be using RemoteViews.setOnClickPendingIntent.

like image 172
Manish Mulimani Avatar answered Nov 03 '22 20:11

Manish Mulimani