2012-11-20 23 views
6

अपडेट नहीं करता है मेरे विजेटिस में टेक्स्ट व्यू होम स्क्रीन पर रखे जाने पर सही जानकारी के साथ सही तरीके से सेट किया गया है। लेकिन जब मैं मुख्य ऐप में जानकारी अपडेट करता हूं, तो विजेट अभी भी पुरानी जानकारी दिखाता है।एंड्रॉइड विजेट में टेक्स्ट व्यू

मैनिफ़ेस्ट:

<receiver android:name=".WidgetProvider" android:label="@string/app_name" android:exported="false"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 

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

WidgetProvider.java:

package com.example.huskeliste; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.RemoteViews; 

public class WidgetProvider extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     for (int i = 0; i < N; i++) { 
      int widgetId = appWidgetIds[i]; 

      DBAdapter info = new DBAdapter(context); 

      info.open(); 
      String data = info.getTextViewData(); 
      info.close(); 

      Intent intent = new Intent(context, Main.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
      views.setOnClickPendingIntent(R.id.loWidget, pendingIntent); 
      views.setTextViewText(R.id.txtView, data); 
      appWidgetManager.updateAppWidget(widgetId, views); 
     } 
    } 
} 

रेस - widget.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:initialLayout="@layout/widget" 
    android:minWidth="294dp" 
    android:minHeight="72dp" 
    android:updatePeriodMillis="1800000"> 
</appwidget-provider> 

लेआउट - widget.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/loWidget" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:gravity="center" 
    android:layout_margin="1dp" 
    android:background="@drawable/background"> 

    <TextView 
     android:id="@+id/txtView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="22dp" 
     android:textColor="#ffffff" 
     android:text="" /> 
</LinearLayout> 

background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <gradient android:startColor="#CC111111" android:endColor="#CC111111" android:angle="0" /> 
    <padding android:left="4dp" android:top="1dp" android:right="4dp" android:bottom="1dp" /> 
    <corners android:radius="3dp" /> 
</shape> 

getTextViewData() DBAdapter.java से:

public String getTextViewData() { 
    String[] columns = new String[] { KEY_NAME }; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 

    String result = ""; 

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {   
     if (result.length() > 0) { 
      result += ", "; 
     } 

     result += c.getString(0); 
    } 

    return result; 
} 

किसी को भी एक सुराग क्या मेरी कोड में कमी है है?

उत्तर

4

आपको अपने विजेट प्रदाता एक्सएमएल के अंदर मिलीसेकंड में अपडेट अंतराल सेट करने की आवश्यकता है। Example code:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="72dp" 
    android:updatePeriodMillis="86400000" 
    android:previewImage="@drawable/preview" 
    android:initialLayout="@layout/example_appwidget" 
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical" 
    android:widgetCategory="home_screen|keyguard" 
    android:initialKeyguardLayout="@layout/example_keyguard"> 
</appwidget-provider> 

हालांकि, आपको पता होना चाहिए कि इस प्रणाली की गारंटी नहीं देता विजेट अक्सर के रूप में अद्यतन किया जाना है। साथ ही, यदि आप विजेट को अधिक बार अपडेट करना चाहते हैं (उदा। कॉन्फ़िगरेशन परिवर्तन के बाद, जैसा कि यह आपके प्रश्न के साथ है), आपको इसे मैन्युअल रूप से करने की आवश्यकता है। यहाँ मैं कैसे आगे बढ़ना है:

इस उदाहरण मेरी विजेट वर्ग बस Widget.class कहा जाता है:

public class Widget extends AppWidgetProvider { 

    // TODO: Don't forget to override the onUpdate method also 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("update_widget")) { 
      // Manual or automatic widget update started 

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

      // Update text, images, whatever - here 
      remoteViews.setTextViewText(R.id.yourTextID, "My updated text"); 

      // Trigger widget layout update 
      AppWidgetManager.getInstance(context).updateAppWidget(
        new ComponentName(context, Widget.class), remoteViews); 
     } 
    } 

} 

लेआउट और अपने विजेट लेआउट के संदर्भ के साथ TextView को बदलने के लिए सुनिश्चित करें।

तो जब भी आप अपने विजेट अद्यतन करने के लिए (जैसे कि आपका मुख्य गतिविधि या जब भी एक सहेजें बटन क्लिक किया जाता है की विधि में) चाहते हैं, तो आप एक PendingIntent फोन:

Intent updateWidget = new Intent(context, Widget.class); // Widget.class is your widget class 
updateWidget.setAction("update_widget"); 
PendingIntent pending = PendingIntent.getBroadcast(context, 0, updateWidget, PendingIntent.FLAG_CANCEL_CURRENT); 
pending.send(); 
+0

तेजी से answere के लिए धन्यवाद। Main.java में इरादा अद्यतन में "संदर्भ" अद्यतन Widget = नया इरादा (संदर्भ, WidgetProvider.class); खाली है। मुझे संदर्भ कैसे सेट करना चाहिए? – user1759708

+0

संदर्भ के साथ चिह्नित किया गया है "संदर्भ को चर के लिए हल नहीं किया जा सकता है"। – user1759708

+1

यह आपका गतिविधि संदर्भ है। आप 'getBaseContext()' या 'this' का उपयोग कर सकते हैं। –

संबंधित मुद्दे