2013-11-09 19 views
7

Tôi tạo widget cho ứng dụng Android (trong Java, tất nhiên). Tôi đã tạo RemoteView cổ điển từ bố cục (sử dụng id bố cục)Cách chỉnh sửa/thay đổi Chế độ xem từ bố cục trong RemoteView hoặc tạo RemoteView từ Chế độ xem?

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.view); 

và tôi cần chỉnh sửa hoặc thay đổi chế độ xem (nhận dạng theo id). Trong chế độ xem cổ điển, thật dễ dàng, sử dụng hàm findViewById.

View v = ... //inflate layout R.layout.view 
View my = v.findViewById(R.id.myViewId); 
processView(my); //filling view 

Nhưng nó không được hỗ trợ trong RemoteViews. Có thể có được xem bằng cách sử dụng apply(), nhưng sau khi processView và áp dụng lại() Tôi không thấy thay đổi trong xem.

View v = rv.apply(context, null); 
View my = v.findViewById(R.id.myViewId); 
processView(my); //this work's fine 
rv.reapply(context,my); 

Thứ hai, lựa chọn tồi tệ hơn, là có được cần RemoteViews xem hình thức của tôi, quá trình đó, xóa điểm cũ và thêm xử lý xem mới sử dụng addView().

RemoteViews rv = ... 
View my = ... //apply, find and process 
//remove old view 
RemoteViews rvMy = ... //create RemoteViews from View 
rv.addView(rvMy) 

Nhưng tôi không biết cách tạo RemoteView từ chế độ xem (có thể?). Bất kỳ ý tưởng nào giải quyết vấn đề này?

+0

Tôi nghĩ câu hỏi của bạn cần được làm rõ một chút. Bạn đang cố gắng thay đổi văn bản của chế độ xem từ xa mà không biết ID của nó? –

Trả lời

1

Bởi vì chỉnh sửa/thay đổi (phụ) nhìn từ removeview hoặc tạo remoteview khỏi tầm nhìn là propably không thể (trên cơ sở thông tin mà tôi thành lập) Tôi giải quyết vấn đề của tôi bằng cách sử dụng đặt tên xem cần thiết (hầu hết các textview), geting xem id sử dụng tên và phản ánh của mình và proc ess trong chu kỳ. Để đặt tên là có thể sử dụng bash, python, hoặc bất cứ điều gì khác.

Ví dụ:

RemoteView rv = ... 

/* 
exemplary rv layout: 
+-----+-----+-----+-----+-----+-----+ 
|tv0x0|tv0x1|tv0x2|tv0x3|tv0x4|tv0x5| 
+-----+-----+-----+-----+-----+-----+ 
|tv1x0|tv1x1|tv1x2|tv1x3|tv1x4|tv1x5| 
+-----+-----+-----+-----+-----+-----+ 
*/ 

String prefix = "tv"; 
for(int i=0; i<2;i++) 
{ 
    for(int j=0; j<6; j++) 
    { 
     // use reflection, searched in stackoverflow 
     int id = getItemIdFromName(prefix+i+"x"+j); 
     // working with concrete id using RemoteView set functions, e.g 
     rv.setTextViewText(id, String.ValueOf(i); 
    } 
} 

Bằng cách này có thể xử lý một số lượng lớn các quan điểm và áp dụng chức năng remoteview cho họ.

3

Hãy thử cách này:

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

     remoteViews.setTextViewText(R.id.widget_textview, text); <---- here you can set text 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 

Đây là một bài hữu ích để hiểu hành vi phụ tùng:

http://www.vogella.com/articles/AndroidWidgets/article.html

+4

Cảm ơn bạn đã trả lời. Phương thức này (và tập hợp khác *) để thiết lập các thuộc tính của đối tượng RemoteViews mà tôi biết. Vấn đề là, hơn tôi phải biết tất cả các ID và thiết lập mỗi người trong số họ một cách riêng biệt (trong widget và cũng trong bố trí) - nó có thể, nhưng không phải là tốt! Ví dụ: bây giờ tôi có một bố trí với cấu trúc được xác định. Khi tôi muốn điền chúng tôi đưa anh ta vào phương pháp trình bày (hiện tại (Xem v)) và đó là tất cả! Giải pháp có thể có thể được đặt trong bố cục của ID và sử dụng sự phản chiếu để lặp lại và xử lý chúng. Nếu không phải là lựa chọn tốt hơn! [Tôi hy vọng điều này là dễ hiểu.] – honzakuzel1989

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