2013-07-22 4 views
0

Мой виджет - виджет уровня батареи. Я хочу отображать различные изображения батареи в зависимости от уровня заряда батареи. Возможно ли это из моего кода?Как изменить изображение моего виджета батареи в зависимости от уровня заряда батареи?

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); 
     } 

и 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> 

Спасибо.

ответ

1

Я достиг этого в прошлых проектах, показывая/скрывая разные виды. Нечто подобное в вашем 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); 
} 

Тогда в вашем XML, установить все imageviews в android:visibility="GONE" так, что все они скрыты по умолчанию, в противном случае вы будете видеть беспорядок изображений свалили на вершине друг от друга, для второго, когда вы первый набор виджетов:

<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" /> 

это не очень элегантно, но был единственным способом, которым я мог заставить его работать.

+0

Спасибо позже, я попробую. Но фактический код внутри моего 'updateView()', где я должен его поставить? Там есть, к примеру, эта часть: 'thisViews.setTextViewText', которая показывает уровень заряда батареи. –