2012-11-21 16 views
5

Daha önce benzer bir soru sordum ama isteğimde çok belirsizdim. Aşağıdaki kod, güzel bir stilize düğme çizer. Düğmeye tıkladığınızda, bir sayı girebilir ve sayıya bağlı olarak,Bir Android Widget'ı ile setBackground nasıl kullanılır

remoteViews.setInt (R.id.nmcButton, "setBackgroundColor", color) kullanarak arka plan rengini değiştirir;

Maalesef

, ben

remoteViews.setInt (R.id.nmcButton, "setBackground", renk) kullanarak stil korumak için denemek; Pencere öğesi yüklenmeyecek

. Bunun etrafında bir yolu var mı? Arka plan rengini değiştirirken stilleri korumanın bir yolu var mı?

Burada ilgili dosyaların

package test.widget; 

    import android.os.Bundle; 
    import android.app.PendingIntent; 
    import android.appwidget.AppWidgetManager; 
    import android.appwidget.AppWidgetProvider; 
    import android.content.ComponentName; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.util.Log; 
    import android.widget.RemoteViews; 
    import android.graphics.Color; 

    public class MyWidget extends AppWidgetProvider { 

     private final static String TEST_ACTIVITY = "test.widget.action.TEST_ACTIVITY"; 
     private final static int INTENT_NO_REQUEST = 0; /* no requestCode */ 
     private final static int INTENT_NO_FLAGS = 0; /* code for no Flags */ 
     private int count = 9; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      super.onReceive(context, intent); 
      Bundle b = intent.getExtras(); 
      if (b != null) { 
       count = b.getInt("nmcCount"); 
       callOnUpdate(context); 
      } 
     } 

     private void callOnUpdate(Context context) { 
      AppWidgetManager appWidgetManager = AppWidgetManager 
        .getInstance(context); 
      ComponentName thisAppWidget = new ComponentName(
        context.getPackageName(), MyWidget.class.getName()); 
      int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      onUpdate(context, appWidgetManager, appWidgetIds); 
     } 

     @Override 
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
       int[] appWidgetIds) { 
      super.onUpdate(context, appWidgetManager, appWidgetIds); 
      buildUpdate(context, appWidgetManager, appWidgetIds); 
     } 

     private void buildUpdate(Context context, 
       AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
      final int N = appWidgetIds.length; 
      for (int i = 0; i < N; i++) { 
       int appWidgetId = appWidgetIds[i]; 

       RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
         R.layout.widget); 

       Intent intent = new Intent(TEST_ACTIVITY); 
       PendingIntent pendingIntent = PendingIntent.getActivity(context, 
         INTENT_NO_REQUEST, intent, INTENT_NO_FLAGS); 
       remoteViews.setOnClickPendingIntent(R.id.nmcButton, pendingIntent); 
       remoteViews.setTextViewText(R.id.nmcButton, String.valueOf(count)); 

       // the code below works, but the button does not have nice styling 
       // int color = (count >= 5) ? Color.GREEN : Color.RED; 
       // remoteViews.setInt(R.id.nmcButton, "setBackgroundColor", color); 

       // this code doesn't work, you get "problem loading widget" 
       int color = (count >= 5) ? R.drawable.btn_green 
         : R.drawable.btn_red; 
       remoteViews.setInt(R.id.nmcButton, "setBackground", color); 

       appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
      } 
     } 
    } 

bazı

<?xml version="2.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 

     <item android:state_pressed="true"><shape> 
     <solid android:color="#ef4444" /> 

     <stroke android:width="1dp" android:color="#992f2f" /> 

     <corners android:radius="3dp" /> 

     <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
    </shape></item> 
     <item><shape> 
     <gradient android:angle="270" android:endColor="#992f2f" android:startColor="#ef4444" /> 

     <stroke android:width="1dp" android:color="#992f2f" /> 

     <corners android:radius="3dp" /> 

     <padding android:bottom="11dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
    </shape></item> 

    </selector> 

styles.xml btn_red.xml olan

Bir iş cevabı vardı
<resources> 
     <style name="ButtonText"> 
      <item name="android:layout_width">wrap_content</item> 
      <item name="android:layout_height">wrap_content</item> 
      <item name="android:gravity">center</item> 
      <item name="android:layout_margin">1dp</item> 
      <item name="android:textSize">10dp</item> 
      <item name="android:textStyle">normal</item> 
      <item name="android:shadowColor">#000000</item> 
      <item name="android:shadowDx">1</item> 
      <item name="android:shadowDy">1</item> 
      <item name="android:shadowRadius">2</item> 
      <item name="android:textColor">#ffffff</item> 
     </style> 
     <style name="AppTheme" parent="android:Theme.Light" /> 
    </resources> 

cevap

13

, ben kullanmış olmalıdır :

remoteViews.setInt(R.id.nmcButton, "setBackgroundResource", color); 

yerine:

remoteViews.setInt(R.id.nmcButton, "setBackground", color); 
+0

Çalışmıyor. Stil kaldırıldı. Bu kendi sorunuzu cevaplamıyor – AxeManTOBO

1

benim için işe yaramadı ama bu çalıştı.

Bunu yapmak gerekir widget'ınızda bir renk ayarlamak istiyorsanız: Bu benim widget'ınızda benim ListView benim için çalışmıyor

remoteViews.setInt(R.id.nmcButton, "setBackgroundColor", color); 
+0

Bir setBackgroundColor –

+0

@BrenoSalgado sonra stil kaybetme sorunu ele almıyor çünkü downvoted Sonra neden downvote? Bu sizin için bir cevap olmayabilir, ama kesinlikle benim için mükemmel çalışır.Yukarıdaki cevap da bu meseleyi ele almıyor mu? Bu yöntemi kullandıktan sonra stilinizi kaybettiğinize dair bir yorum da bırakabilirsiniz. –

+0

Kişisel bir şey yok, ama sorunun doğru şekilde ele alınmadığını düşünüyorum. Java/Android cevaplarındaki kalitenin bir miktar düşük olduğunu düşünüyorum çünkü bunun çok fazlası var. Ruby cevaplarında (örnek olarak), okuyucuda problemin ne olduğunu açıklamaya çalışarak, çözüm önerisinde bulunarak, OP'de yapılan her soruyu ele alarak, bağlantılar sağlayarak vb. Yanıtlar için kullanmıştım. Bu, IMO'nun daha iyi bir yoludur. size sadece 3 cevabını sorduğun ve geri kalanını görmezden geldiğine dair mektup, en kibar değil, değil mi?), SO bir forum değil (yine, seni rahatsız etmek istemiyorum, ama bence bu bir doğru) –

0

, bu yüzden geçici bir çözüm ile geldi:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/iv_widget_background" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="fitXY" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     android:orientation="vertical" 
     android:padding="@dimen/widget_listview_padding"> 

     <ListView 
      android:id="@+id/lv_widget" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:divider="@null" 
      android:dividerHeight="0dp" /> 
    </LinearLayout> 

</FrameLayout> 

Sonra böyle R.drawable içinde drawables tanımlanmış:

bir ImageView benim arka plan çizmek olduğu yerde

Önce FrameLayout edilecek benim düzenini tanımlanmış

red.xml: Aşağıdaki do AppWidgetProvider benim OnUpdate() fonksiyonunda Sonra

 Intent intent = new Intent(context, WidgetProvider.class); 
     intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
     context.sendBroadcast(intent); 

: Kullanıcı SharedPrefs yoluyla arka plan değiştirir

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#F44336" /> 
</shape> 

aşağıdaki yapmak zorunda :

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWdgetIds) { 
    try { 
     RemoteViews remoteViews; 
     for (int appWdgetId : appWdgetIds) { 
      remoteViews = updateWidgetListView(context, appWdgetId); 
      appWidgetManager.updateAppWidget(appWdgetId, remoteViews); 
     } 
     super.onUpdate(context, appWidgetManager, appWdgetIds); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private RemoteViews updateWidgetListView(Context context, int appWidgetId) { 
    //which layout to show on widget 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
    Intent svcIntent = new Intent(context, WidgetService.class); 
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);  svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    remoteViews.setRemoteAdapter(appWidgetId, R.id.lv_widget, svcIntent); 

    setBackground(context, remoteViews); 

    return remoteViews; 
} 

private void setBackground(Context context, RemoteViews remoteViews) { 
    String background = Utils.getStringValue(context, R.string.pref_widget_backgroundcolor_key, 
      R.string.pref_widget_backgroundcolor_default); 

    if (!TextUtils.isEmpty(background)) { 
     int identifier = context.getResources().getIdentifier(
       background, "drawable", context.getPackageName()); 
     remoteViews.setImageViewResource(R.id.iv_widget_background, identifier); 
    } 
} 

Sonuç:

enter image description here

İlgili konular