My widget is a battery level widget.. what i want is to display different images of the battery depending on battery level. Is this possible from my code?

BatteryStatusWidgetActivity

public class BatteryStatusWidgetActivity extends AppWidgetProvider {  
   /** Called when the activity is first created. */  
      private String batteryLevel = "init";  
      private int widgetImageFrame = R.drawable.widget_batt_frame01;  
      @Override  
      public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
           context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
           updateView(context);  
      }  
      @Override  
      public void onReceive(Context context, Intent intent) {  
           int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);  
           int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);  
           int level = 65;  
           level = (rawlevel * 100) / scale;  
           batteryLevel = level + "%";  
           widgetImageFrame = R.drawable.widget_batt_frame01;  
           updateView(context);  
           super.onReceive(context, intent);  
      }  
      public void updateView(Context context) {  
           RemoteViews thisViews = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.widget_layout);  
           thisViews.setTextViewText(R.id.widget_text, batteryLevel);  
           thisViews.setImageViewResource(R.id.imageView1, widgetImageFrame);  
           ComponentName thisWidget = new ComponentName(context, BatteryStatusWidgetActivity.class);  
           AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, thisViews);  
      }

and the widget_layout

<?xml version="1.0" encoding="utf-8"?>  
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   android:id="@+id/relativeLayout1"  
   android:layout_width="wrap_content"  
   android:layout_height="wrap_content"  
   android:gravity="center" >  
     <ImageView  
       xmlns:android="http://schemas.android.com/apk/res/android"  
       android:id="@+id/imageView1"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_alignParentLeft="true"  
       android:layout_alignParentTop="true"  
       android:src="@drawable/widget_batt_frame01" />  
           <LinearLayout  
             xmlns:android="http://schemas.android.com/apk/res/android"  
             android:id="@+id/layout"  
             android:layout_width="wrap_content"  
             android:layout_height="wrap_content"  
             android:layout_centerHorizontal="true"  
             android:layout_centerVertical="true"  
             android:layout_margin="10dip"  
             android:gravity="center_vertical"  
             android:orientation="vertical"  
             android:paddingTop="0dip" >  
             <TextView  
               android:id="@+id/widget_text"  
               style="@android:style/TextAppearance.Medium"  
               android:layout_width="wrap_content"  
               android:layout_height="0dp"  
               android:layout_gravity="center_vertical"  
               android:layout_weight="1"  
               android:gravity="center_horizontal|center_vertical"  
               android:text="@string/battery_level"  
               android:textSize="12dp"  
               android:textColor="#000000"/>  
           </LinearLayout>  
 </RelativeLayout> 

Thank you.

有帮助吗?

解决方案

I have achieved this in past projects by showing/hiding different views. Something like this in your updateView():

if (level > 90) {
    thisViews.setViewVisibility(widget_frame01, View.VISIBLE);
    thisViews.setViewVisibility(widget_frame02, View.GONE);
    thisViews.setViewVisibility(widget_frame03, View.GONE);
} else if (level > 80) {
    thisViews.setViewVisibility(widget_frame01, View.GONE);
    thisViews.setViewVisibility(widget_frame02, View.VISIBLE);
    thisViews.setViewVisibility(widget_frame03, View.GONE);
} else {
    thisViews.setViewVisibility(widget_frame01, View.GONE);
    thisViews.setViewVisibility(widget_frame02, View.GONE);
    thisViews.setViewVisibility(widget_frame03, View.VISIBLE);
}

Then, in your xml, set all of the imageviews to android:visibility="GONE" so that they are all hidden by default, otherwise you'll see a mess of images piled on top of each other for a second when you first set the widget:

    <ImageView  
           xmlns:android="http://schemas.android.com/apk/res/android"  
           android:id="@+id/widget_frame01"  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:layout_alignParentLeft="true"  
           android:layout_alignParentTop="true"  
           android:src="@drawable/widget_batt_frame01"
           android:visibility="GONE" />
    <ImageView  
           xmlns:android="http://schemas.android.com/apk/res/android"  
           android:id="@+id/widget_frame02"  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:layout_alignParentLeft="true"  
           android:layout_alignParentTop="true"  
           android:src="@drawable/widget_batt_frame02"
           android:visibility="GONE" />
    <ImageView  
           xmlns:android="http://schemas.android.com/apk/res/android"  
           android:id="@+id/widget_frame03"  
           android:layout_width="wrap_content"  
           android:layout_height="wrap_content"  
           android:layout_alignParentLeft="true"  
           android:layout_alignParentTop="true"  
           android:src="@drawable/widget_batt_frame03"
           android:visibility="GONE" />

It's not very elegant, but was the only way I could get it to work.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top