添加首选项活动后,小组件未放置在主屏幕上

时间:2014-02-20 19:28:54

标签: android android-widget android-preferences

在我的窗口小部件中添加首选项活动后,我无法再将其添加到主屏幕。

当我在屏幕上放置小部件时,首选项活动按预期显示,我可以使用它,设置存储,但关闭它的唯一方法是后退按钮,一旦我按下它我会回到小部件选择屏幕,没有小部件添加到主屏幕。

该问题上的documentation has only a very limited example以及我可以在此找到的每个示例或教程都已过时(适用于SDK 1.5或类似版本),其中几乎没有任何内容适用。

我尝试将这些行从文档添加到我的首选项活动的onStop()方法中,但它不会改变行为。

那么,如何正确关闭首选项活动以便WidgetManager将小部件添加到主屏幕?

以下是相关文件:

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.schneidr.mytchibo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="18" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <receiver android:name="de.schneidr.android.MyTchiboWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                       android:resource="@xml/mytchibo_appwidget_info" />
        </receiver>

        <activity android:name="de.schneidr.android.MyTchiboWidgetConfigure">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
            </intent-filter>
        </activity>

    </application>

</manifest>

appinfo_widget.xml:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="250dp"
    android:minHeight="40dp"
    android:minResizeWidth="250dp"
    android:minResizeHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/tcm_logo"
    android:initialLayout="@layout/mytchibo_appwidget"
    android:resizeMode="none"
    android:configure="de.schneidr.android.MyTchiboWidgetConfigure" 
    android:widgetCategory="home_screen">
</appwidget-provider> 

MyTchiboWidgetConfigure.java

package de.schneidr.android;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;
import de.schneidr.mytchibo.R;

public class MyTchiboWidgetConfigure extends Activity {

       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Display the fragment as the main content.
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new MyTchiboWidgetConfigureFragment())
                    .commit();
        }

       protected void onStop() {
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            int mAppWidgetId = 0;
            if (extras != null) {
                mAppWidgetId = extras.getInt(
                        AppWidgetManager.EXTRA_APPWIDGET_ID, 
                        AppWidgetManager.INVALID_APPWIDGET_ID);
            }

            Context context = this.getApplicationContext();

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

            RemoteViews views = new RemoteViews(context.getPackageName(),
                    R.layout.mytchibo_appwidget);
                    appWidgetManager.updateAppWidget(mAppWidgetId, views);

            Intent resultValue = new Intent();
            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
            setResult(RESULT_OK, resultValue);
            finish();
           super.onStop();
       }
}

2 个答案:

答案 0 :(得分:3)

好的,我在this answer找到了解决方案。基本上,我在OnStop()函数中的内容属于onBackPressed()

public class MyTchiboWidgetConfigure extends Activity {
    private static String CONFIGURE_ACTION="android.appwidget.action.APPWIDGET_CONFIGURE";

    @Override
    public void onBackPressed() {
        if (CONFIGURE_ACTION.equals(getIntent().getAction())) {
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();

            if (extras != null) {
                int id = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
                        AppWidgetManager.INVALID_APPWIDGET_ID);
                AppWidgetManager mgr = AppWidgetManager.getInstance(this);
                RemoteViews views = new RemoteViews(getPackageName(),
                        R.layout.mytchibo_appwidget);

                mgr.updateAppWidget(id, views);

                Intent result = new Intent();

                result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
                setResult(RESULT_OK, result);
                sendBroadcast(new Intent(this, MyTchiboWidgetProvider.class));
            }
        }

        super.onBackPressed();
    }
}

解决方案直接来自这里: https://github.com/commonsguy/cw-advandroid/blob/b01438e7f0fed8f795ddec4be43066905f03d0cc/AppWidget/TwitterWidget/src/com/commonsware/android/appwidget/TWPrefs.java

答案 1 :(得分:3)

好吧,没有让配置(首选项)活动的启动模式“singleInstance”为我工作。 我不知不觉地添加了这一行

        android:launchMode="singleInstance"

在我的活动清单中。我删除了该行,但它确实有效。