2011-10-04 7 views
6

Tôi có một homescreenwidget trong Android với hai nút. Cả hai nút nên gọi cùng một hoạt động (lớp) chỉ sử dụng một ý định khác nhau cộng với tính năng bổ sung ý định, để biết nút nào được gọi là lớp. Hiện tại chỉ có button1 đang hoạt động và gọi cho hoạt động. Tôi cũng nhận được keyvalue trong hoạt động được gọi là.Hai nút tiện ích Android gọi cùng Hoạt động với các mục đích khác nhau

Tôi làm cách nào để nút thứ hai hoạt động? Dưới đây là mã của tôi:

   public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    for (int i =0; i<appWidgetIds.length ; i++){ 

     int appWidgetId = appWidgetIds[i]; 

     Intent intent2 = new Intent(context, Main.class); 
     Intent intent1 = new Intent(context, Main.class); 

     // Intent put extras Button 1 
     String bread1 = "secure"; 
     Bundle basket1 = new Bundle(); 
     basket1.putString("key", bread1); 
     intent1.putExtras(basket1); 

     // Intent put extras Button 2 
     String bread2 = "insecure"; 
     Bundle basket2 = new Bundle(); 
     basket2.putString("key", bread2); 
     intent2.putExtras(basket2); 

     PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, 0); 
     PendingIntent pending2 = PendingIntent.getActivity(context, 0, intent2, 0); 

     RemoteViews views1 = new RemoteViews(context.getPackageName(),R.layout.maina); 
     RemoteViews views2 = new RemoteViews(context.getPackageName(),R.layout.maina); 

     views1.setOnClickPendingIntent(R.id.button1, pending1); 
     views2.setOnClickPendingIntent(R.id.button2, pending2); 

     appWidgetManager.updateAppWidget(appWidgetId, views1); 
     appWidgetManager.updateAppWidget(appWidgetId, views2); 

đây là maina.xml

  <?xml version="1.0" encoding="utf-8"?> 
      <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:weightSum="1"    android:orientation="vertical"> 
      <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/tvWidget" android:textAppearance="?android:attr/textAppearanceLarge"></TextView> 

      <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:weightSum="1" android:orientation="horizontal"> 



      <Button android:text="@string/button1" android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button> 
      <Button android:text="@string/button2" android:id="@+id/button2" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button> 

      </LinearLayout> 

</LinearLayout> 
+0

Bạn có thể cung cấp thêm chi tiết về những gì không hoạt động cho nút thứ hai không? I E. nó không làm gì cả khi được nhấp vào? –

+0

phải, nó không làm gì cả khi được nhấp vào. – Arnold

Trả lời

12

@Arnold bạn đã tạo ra 2 PendingIntent mà là ....

PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, 0); 
PendingIntent pending2 = PendingIntent.getActivity(context, 0, intent2, 0); 

đâu PendingIntent.getActivity (bối cảnh Bối cảnh, int requestCode, ý Ý định, int cờ) có 4 thông số. Bạn phải gửi "requestCode" khác nhau cho các PendingIntents khác nhau.

Mã của bạn nên ....

PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, PendingIntent.FLAG_UPDATE_CURRENT); 
PendingIntent pending2 = PendingIntent.getActivity(context, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 

trong lớp chính bạn cần tạo này ...

String value; 
@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 

      Bundle b=intent.getExtras(); 


    try{ 
    value=b.getString("key"); 
    } 
    catch (Exception e) { 
     // TODO: handle exception 
    } 

    super.onReceive(context, intent); 

} 

với mã onUpdate ....

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, 
      main.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

    for (int widgetId : allWidgetIds) { 
     // Create some random data 

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


     // Register an onClickListener for 1st button 
     Intent intent = new Intent(context, main.class); 

     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds); 
     intent.putExtra("key", "1st Button"); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     remoteViews.setOnClickPendingIntent(R.id.button1, pendingIntent); 

     // Register an onClickListener for 2nd button............ 
     Intent intent2 = new Intent(context, main.class); 

      intent2.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
        intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds); 
      intent2.putExtra("key", "2nd Button"); 

     PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 
       1, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 

     remoteViews.setOnClickPendingIntent(R.id.button2, pendingIntent2); 

     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

Sau đó, bạn có thể kiểm tra xem giá trị = Nút 1 hoặc valu e = Nút thứ hai để biết Nút nào đã được nhấp. Nó sẽ làm việc ... NẾU nó không hoạt động xin vui lòng cho tôi biết vấn đề là gì ...

0

phụ tùng của bạn sẽ chỉ có 1 cái nhìn từ xa. Thử thay đổi đoạn cuối của đoạn mã của bạn thành:

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

remoteView.setOnClickPendingIntent(R.id.button1, pending1); 
remoteView.setOnClickPendingIntent(R.id.button2, pending2); 

appWidgetManager.updateAppWidget(appWidgetId, remoteView); 

Nếu không, sẽ hữu ích khi xem bố cục của bạn trong R.layout.maina.

+0

tôi đã thay đổi mã như bạn đã đề cập. nó cũng không hoạt động. nút2 không có chức năng. nút thay đổi màu sắc khi bạn nhấp vào nó nhưng nó không bắt đầu hoạt động mong muốn. Cảm ơn sự giúp đỡ của bạn – Arnold

+0

Xin lỗi Arnold, không thể phát hiện ra vấn đề khác ngoài việc chỉ ra rằng bạn đang thiếu một thẻ '' gần trong tệp maina.xml của mình. Tuy nhiên, tôi nghi ngờ đây là một vấn đề sao chép và dán như Eclipse nên đã gắn cờ đây là một lỗi khác. Chúc may mắn (và đăng câu trả lời ở đây nếu bạn tìm ra)! –

2

Tôi gặp sự cố tương tự khi sử dụng 2 nút trên tiện ích. Tôi đặt OnClickPendingIntents trên cả hai, phân biệt bởi các cuộc gọi setExtra() khác nhau. Nhưng chỉ có ý định thứ hai được gọi là, ngay cả khi nhấp vào nút đầu tiên. tôi thấy 2 giải pháp: - gán các hành động khác nhau để cả hai PendingIntents - trên PendingEvent thứ hai đặt cờ PendingEvent.FLAG_CANCEL_CURRENT

tôi khá quen thuộc với PendingEvents và Widgets, vì vậy tôi không thể nhìn thấy những ưu và khuyết điểm và sẽ dính vào giải pháp đầu tiên.

Có thể điều đó cũng có thể giúp bạn khắc phục sự cố của bạn.

1

Trong trường hợp của tôi:

remoteViews.setOnClickPendingIntent(R.id.widget_head, touch_man(context)); 

remoteViews.setOnClickPendingIntent (R.id.widget_head2, touch_woman (ngữ cảnh));

public static PendingIntent touch_man(Context context) { 

    Intent intent = new Intent(); 
    intent.setAction("touch_man"); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

} 

public static PendingIntent touch_woman(Context context) { 

    Intent intent = new Intent(); 
    intent.setAction("touch_woman"); 
    return PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

} 

Trong AndroidManifest

<receiver 
     android:name="Receiver" 
     android:label="widgetBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="touch_man" /> 
      <action android:name="touch_woman"/> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/demo_widget_provider" /> 
    </receiver> 

Đó là làm việc.