2013-03-21 62 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

相關問題