2010-03-16 94 views
20

我想創建一個AppWidget,其中TextView的背景顏色隨機以指定的週期性間隔更改。Android AppWidget TextView:如何在運行時設置背景顏色

TextView的在佈局xml文件定義爲

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/widget" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 
    <TextView 
     android:id="@+id/message" 
     android:background="#ff99ff" 
     android:text="Hello Widget" /> 
</LinearLayout> 

在更新方法中,我已加載的佈局

RemoteViews remoteView=new RemoteViews(context.getPackageName(),R.layout.widget_message); 

要改變我用下面的語句的TextView的背景

remoteView.setInt(R.id.message, "setBackgroundResource", R.color.col_1); 

但我收到了一個小部件,指出加載小部件的問題。如果我刪除上面的行一切工作正常。

logcat的說:

updateAppWidget找不到任何 視圖,用錯誤觀點

android.widget.RemoteViews $ ActionException: 觀點:android.widget.TextView不能 使用方法與RemoteViews: setBackgroundResource(int)

回答

0

原因是,通過RemoteViews你可以調用只是有限的方法的安裝。如果它被禁止,你會得到這樣的消息。

Tom

+0

正是。您只能使用具有@RemotableViewMethod註釋的方法 – 2013-12-12 22:08:56

1

Tomas是正確的。我的解決方案是用各自的背景製作兩個視圖,使一個INVISIBLE和另一個可見。當然,這隻適用於少數背景,例如可能指示某種狀態的「綠色」和「紅色」。

0

我覺得奇怪的是,它在我的Nexus One(2.2)上效果很好,但在HTC Tattoo(1.6)上卻沒有。我將嘗試運行一些模擬器測試,看看它不僅僅是HTC的另一種情況,它懶洋洋地實現了一些底層的UI渲染代碼,我已經在Tattoo(Layouts呈現方式與Android 1.6版本不同)中找到了代碼。

你在測試什麼設備?

+0

不適用於我的2.1模擬器。也許限制在Android 2.2中被刪除?另請參閱android- developers組上的[本討論](http://groups.google.com/group/android-developers/browse_thread/thread/aa000a36eadafaa5/a406589560d76784#a406589560d76784):聽起來像是衆所周知的限制 – MarkJ 2010-09-21 09:59:19

+0

Now我做的是: views.setImageViewBitmap(R.id.background,BitmapFactory.decodeResource(context.getResources(),info.backgroundImageId)); 它更麻煩,效率更低,但現在允許我添加可下載的主題 – DavidG 2010-09-25 17:09:43

0

當你運行一個2.2模擬器時,仿真器會讓它通過,所以我想這個限制從2.2開始解除。

1

從android 2.2開始,這個方法可以被調用,而不是之前。

55

試試這個可以正常工作。

remoteView.setInt(R.id.message, "setBackgroundColor", 
     android.graphics.Color.BLACK); 
+0

如果我想保留drawable,該怎麼辦? – TheOnlyAnil 2015-08-05 19:33:43

+1

不適用於像LinearLayout這樣的ViewGroups,它可以處理像TextView這樣的視圖 – IHeartAndroid 2015-12-26 14:45:33

+0

這個解決方案對我試過的ViewGroups起作用。 – Abdullah 2017-12-02 07:35:22

6

如果要設置文本本身的顏色,使用

remoteViews.setInt(R.id.tvAmountThisYear, "setTextColor", 
       android.graphics.Color.RED); 
2

contentView.setInt(R.id.tv_contactText, 「setBackgroundColor」, 顏色。parseColor(hexColor));

+0

這對我有效.... VOILA – peter 2015-10-10 05:44:44

4

如果你有一些形狀TextView的,其中的背景是在一些繪製資源定義的背景,那麼你可以使用

remoteViews.setInt(R.id.change,"setBackgroundResource", R.drawable.my_drawable_new); 

在上面的代碼中的語句,R.id.change是TextView的與一些背景資源,你已經在你的可繪製文件夾中定義了一些資源(my_drawable和我的drawable_new)。

<TextView 
    android:id="@+id/change" 
    android:background="@drawable/my_drawable"> 
</TextView