AppWidget Probleme (Vermutung Receiver Problem)

  • 2 Antworten
  • Letztes Antwortdatum
M

Madlip

Gast
Hallo Community,

ich versuch mich gerade an einen AppWidget und hab dabei folgendes Tutorial durch gearbeitet: Handling User Interaction with Android App Widgets, Page 2 - Developer.com

Hab das soweit aber noch ziemlich simple bei mir gehalten, sprich 4 Buttons und eine TextView die bei Klick einen anderen Text in der TextView anzeigen soll. Aber irgendwie erreicht mein AppWidget nie die onReceiver Methode wie es laut dem Tutorial sein sollte.

Wie gesagt ich denke das es an den Receiver mangelt, weiß aber nicht warum, weil ich es eigentlich soweit gemacht habe wie im obigen Toturial.

Hier nun der Code:

Code:
public class TestProvider extends AppWidgetProvider
{
    private static String TAG = TestProvider.class.getName();
    public static final String VALUE_ZERO= "com.test.testwidget.VALUE_ZERO";
    public static final String VALUEONE = "com.test.testwidget.VALUEONE";
    
    @Override
    public void onEnabled(Context context)
    {
        Log.e(TAG, "onEnable");
        super.onEnabled(context);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.e(TAG, "onUpdate anfang");
        for (int i = appWidgetIds.length; --i >= 0;)
        {
            int appWidgetID = appWidgetIds[i];
            PendingIntent pendingZero = makeZeroPendingIntent(context, "", appWidgetID);
            PendingIntent pendingOne = makeOnePendingIntent(context, appWidgetID);
            
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.sysinfo_main);
            remoteView.setOnClickPendingIntent(R.id.btnPrevious, pendingZero);
            remoteView.setOnClickPendingIntent(R.id.btnNext, pendingOne);
            remoteView.setOnClickPendingIntent(R.id.btnThird, null);
            remoteView.setOnClickPendingIntent(R.id.btnFourth, null);
            
            appWidgetManager.updateAppWidget(appWidgetID, remoteView);
            Log.e(TAG, "onUpdate Ende");
        }
    }
    
    private PendingIntent makeZeroPendingIntent(Context context, String command, int appWidgetId)
    {
        Intent zeroIntent = new Intent();
        zeroIntent.setAction(VALUE_ZERO);
        zeroIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        Log.e(TAG, "makeZeroIntent");
        return PendingIntent.getActivity(context, 1, zeroIntent, 0);
    }
    
    private PendingIntent makeOnePendingIntent(Context context, int appWidgetId)
    {
        Intent oneIntent = new Intent();
        oneIntent.setAction(VALUEONE);
        oneIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        Log.e(TAG, "make ONEIntent");
        return PendingIntent.getActivity(context, 1, oneIntent, 1);
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        final String action = intent.getAction();
        Log.e(TAG, "onReceive anfang" + action);
        if (VALUE_ZERO.equals(action))
        {
            Log.e(TAG, "onReceive Zero");
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.sysinfo_main);
            remoteView.setTextViewText(R.id.textView1, "Zero");
            AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID), remoteView);
        }
        
        if (VALUEONE.equals(action))
        {
            Log.e(TAG, "onReceive VALUEONE");
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.sysinfo_main);
            remoteView.setTextViewText(R.id.textView1, "VALUEONE");
            AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID), remoteView);
        }
        
        super.onReceive(context, intent);
    }
}

Und hier die Manifest:

Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.testwidget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name="TestProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data android:resource="@xml/test_appwidget" android:name="android.appwidget.provider"/>
        </receiver>
        <receiver android:name="TestProvider">
            <intent-filter>
                <action android:name="com.test.testwidget.VALUE_ZERO"/>
            </intent-filter>
        </receiver>
        <receiver android:name="TestProvider">
            <intent-filter>
                <action android:name="com.test.testwidget.VALUEONE"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

hoffe das mir einer von euch helfen kann ...

beste grüße
Mad
 
<receiver android:name="TestProvider">

meinst ist das korrekt ? wenn TestProvider im Root Verzeichnis liegt müsste es doch ".TestProvider" heißen oder? schreib mal den vollen Pfad hin
 
ja, das ist soweit korrekt. Habe es halt auch umgeändert, wie du sagtest, nun steht der komplette Pfad drin.

Was mich auch wundert, wenn ich das Widget erstelle, geht er durch die ganzen Methoden (onReceive, onUpdate etc.), wenn ich nun klicke, sei es auf dem Widget, auf den Buttons hört man nichts (hab den Sound lauter gemacht, um das typische klicken zu hören).
So wenn er nun laut des definierten interval ein zweites mal die Methoden durch geht, geht auf einmal auch das "klicken" also ich höre das dann klicks ankommen.

EDIT:

Ich hab jetzt einige Anpassung gemacht und er läuft dann schonmal in die onReceive Methode rein :)

ich hab in der Manifest folgendes geändert:

Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.testwidget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name="TestProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
                <action android:name="com.test.testwidget.VALUEONE"/>
                <action android:name="com.test.testwidget.VALUE_ZERO"/>
            </intent-filter>
            <meta-data android:resource="@xml/test_appwidget" android:name="android.appwidget.provider"/>
        </receiver>
    </application>
</manifest>

und im Code hab ich anstatt PendingIntent.getActivity() getBroadCast() benutzt ...
 
Zuletzt bearbeitet:
Zurück
Oben Unten