2013-03-21 73 views
2

我实施了widget,其中ImageButtonTextViewImageButton点击时启动activity。此activity用用户在活动EditText上写的内容更新小部件文本。现在的问题是,我只知道如何让IDS是这样的:如何知道点击小工具ID?

for (int widgetId : allWidgetIds) { 
     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(getApplicationContext() 
       .getPackageName(), R.layout.widget_layout); 
     Log.w("WidgetExample", String.valueOf(number)); 

     //Here I should set text from edit text, but I'm using a random for testing. 

     remoteViews.setTextViewText(R.id.textView1, 
       "Random: " + String.valueOf(number)); 

     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 

此代码显然会改变所有的ID的数据,因为它的内部for。无论如何,我可以通过点击widgetId与我的意图,所以我可以消除for?这是我的widgetProvider:

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

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, Widget.class); 
    allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    for (int widgetId : allWidgetIds) { 

     Intent i = new Intent(context, WidgetSetup.class); 
     i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 
     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     // Set the text 
     remoteViews.setTextViewText(R.id.textView1, String.valueOf(number)); 

     Intent active = new Intent(context, Widget.class); 
     active.setAction(ACTION_WIDGET_REFRESH); 
     PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
     remoteViews.setOnClickPendingIntent(R.id.imageButton1, actionPendingIntent); 

     active = new Intent(context, Widget.class); 
     active.setAction(ACTION_WIDGET_SETTINGS); 
     actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
     remoteViews.setOnClickPendingIntent(R.id.imageButton2, actionPendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) { 
     //Log.i("onReceive", ACTION_WIDGET_REFRESH); 

     Intent i = new Intent(context, MainActivity.class); 
     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

    } else if (intent.getAction().equals(ACTION_WIDGET_SETTINGS)) { 
     //Log.i("onReceive", AppWidgetManager.EXTRA_APPWIDGET_ID); 



     Intent i = new Intent(context, WidgetSetup.class); 
     i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 

     //Here I tried to pass the widgetID with no luck. 
     //i.putExtra(pass widget id?); 

     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

    } else { 
     super.onReceive(context, intent); 
    } 
} 

感谢

回答

10

对于正在运行的例子看看我的代码为MiniCallWidget线97和169

+0

完美,正是我需要的。谢谢 – 2013-03-21 20:28:56

+1

你是一个拯救生命的人!这只是这一小部分(第169行),不是在原地,而是让我发疯。非常感谢:) – ranjk89 2014-05-13 15:43:06

+0

它的线** 120 **(用于widgetManager)! – 2016-07-31 19:57:11

1

添加一个额外的给你推出的onClick和创造的意图for循环指定当前控件正在设置ID。

然后从接收活动中的附加内容中检索ID,并在完成时将其传回。然后使用返回的ID仅更改一个窗口小部件。

你可以通过if-else来检查一个标志,告诉你是否只更新一个小部件。

+0

我知道,但我应该在额外设置什么样的价值? – 2013-03-21 15:39:28

+0

那么,你的for循环遍历'allWigetIds',并且当前部件的ID是'widgetId'。所以用'widgetId'添加一个int型的额外值。 – 2013-03-21 15:43:00

+0

我还是不明白你的意思,你能更具体吗?谢谢 – 2013-03-21 19:59:29

相关问题