2010-10-23 25 views
5

Tôi đang cố xác định chủ đề cho appwidget và áp dụng chủ đề đó ở mức cấp ứng dụng. tôi có một chủ đề như,áp dụng chủ đề cho appwidget

<style name="theme.dark"> 
    <item name="android"background">#000000</item> 
</style> 

trong tệp kê khai của tôi, tôi đặt android:theme="@style/theme.dark" tại ứng dụng. Tuy nhiên, khi tôi chạy appwidget, nó không nhận các mục từ phong cách. tôi đã thử đặt style="@style/theme.dark" trên một phần tử riêng lẻ trong bố cục chế độ xem của tôi và điều đó không hoạt động ... nhưng đó không phải là những gì tôi muốn. tôi không muốn gọi một kiểu cụ thể = "..." cho mỗi phần tử trong chế độ xem của tôi. trang này,

http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

có một ứng dụng ví dụ tuyệt vời cho việc sử dụng các chủ đề/phong cách, và nó hoạt động hoàn hảo. sự khác biệt duy nhất là nó là một ứng dụng .. và nó đặt chủ đề trên hoạt động chứ không phải ứng dụng.

Tôi cũng đã thử đặt chủ đề theo cách lập trình trên đối tượng Context bằng cách sử dụng setTheme (...) trong onHandleUpdate() của appwidget, trước khi xem được truy cập. điều đó cũng không hiệu quả.

bất kỳ ý tưởng nào? cảm ơn.

Trả lời

5

câu trả lời là bạn không thể áp dụng chủ đề động cho appwidget. không có giải pháp nào khác ngoài việc cung cấp nhiều bố cục mỗi tham chiếu tĩnh một chủ đề cụ thể, sau đó chọn chủ đề/bố cục chính xác khi bạn tạo các chế độ xem từ xa của mình.

0

Sử dụng setVisibility để ẩn bố cục với phong cách riêng của nó ở chế độ nền. Như thế này:

public static void changeWidgetState(RemoteViews remoteView, int state){ 
    switch (state){ 
     case 0:{ 
      remoteView.setViewVisibility(R.id.widgetLayout1, View.VISIBLE); 
      remoteView.setViewVisibility(R.id.widgetLayout2, View.GONE); 
     } break; 
     case 1:{ 
      remoteView.setViewVisibility(R.id.widgetLayout1, View.GONE); 
      remoteView.setViewVisibility(R.id.widgetLayout2, View.VISIBLE); 
     } break; 
     ... 
     default: 
    } 

} 

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/widgetLayout0" 
      android:layout_width="150dip" 
      android:layout_height="wrap_content" 

      > 

     <!--Normal Theme Black Text --> 
     <RelativeLayout 
       android:id="@+id/widgetLayout1" 
       android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       style="@style/WidgetBackgroundNormal" 

       /> 
     <!--Yellow Theme Black Text --> 
     <RelativeLayout 
       android:id="@+id/widgetLayout2" 
       android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       style="@style/WidgetBackgroundYellow" 
       /> 
     ... 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_height="fill_parent" 
      android:layout_width="fill_parent" 
      android:paddingTop="7dip" 
      > 
      <TextView 
       android:id="@+id/widget_server_name" 
       style="@style/Text.DefinitionWhite" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:layout_gravity="left" 
       android:layout_marginLeft="10dip" 
        /> 
      .... 
     </LinearLayout> 
    </RelativeLayout> 
+1

tôi không thấy cách tốt hơn là chỉ chọn một tệp sơ đồ bố trí hoặc tệp khác ... đây là điều tương tự nhưng trong một tệp dữ liệu. –

+0

oh, bạn sẽ làm điều này như thế nào, bạn có thể cung cấp ví dụ không? –

1

Vì chúng ta không thể sử dụng chủ đề tự động đến một appwidget, tôi đề nghị giải pháp đơn giản tiếp theo - chỉ cần chuyển qua lại giữa các file layout:

Giả sử chúng ta có hai khác nhau bố cục:

  • layout1.xml
  • layout2.xml

Chúng tôi thiết lập bố trí của chúng tôi như sau:

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

Và khi chúng ta cần chúng tôi chuyển nó đến một giây bởi:

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

Giải pháp này đang làm việc tốt cho tôi.

+1

đây là những gì tôi đã kết thúc cũng làm, nhưng khi bạn bắt đầu với 2 bố trí cho cổng và đất, lần n chủ đề, lần n bố trí cho kích thước màn hình khác nhau, nó không thể quản lý. tạo bố cục có nghĩa là áp dụng cẩn thận cùng một thay đổi cho từng bố cục khác nhau. –

+0

Bạn hoàn toàn đúng về tình huống mà chúng tôi sẽ có các chủ đề có kích thước khác nhau. Tôi tin rằng có tồn tại một số tweeks cho rằng :) – Jviaches

-3

Sử dụng một ContextThemeWrapper nên làm các trick http://developer.android.com/reference/android/view/ContextThemeWrapper.html

+0

Tại sao điều này đã được bình chọn? – JosephMCasey

+0

'ContextThemeWrapper' hoặc bất kỳ' Context' thực sự là không thích hợp cho 'RemoteView' bởi vì 'RemoteView' được sắp xếp theo thứ tự và gửi đến các ứng dụng khác như bệ phóng. Các ứng dụng như vậy sau đó vẽ chúng bằng cách sử dụng 'Context's của chúng – tasomaniac

0

Sử dụng style="@android:style/Widget.(THEME).(CONTROLTYPE)" trong cách bố trí có liên quan, ví dụHolo vào một nút :

<Button 
    android:id="@+id/button1" 
    style="@android:style/Widget.Holo.Button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Các style= trên sẽ kiểu một nút tương đương với những gì thiết android:theme="android:Theme.Holo" trong manifest sẽ làm gì để nút đó, là một hoạt động này.

Các vấn đề liên quan