【问题标题】:Widget becomes invisible after reinstall重新安装后小部件变得不可见
【发布时间】:2012-06-13 17:20:38
【问题描述】:

我有一个带有配置活动的小部件。当用户想要将小部件放置在主屏幕上时,配置活动打开,用户选择小部件的内容、背景颜色和文本颜色,就可以了。当我重新安装应用程序时,小部件变得不可见。它仍然存在,但没有文字和颜色。见图片:

我将发布我所有的文件,最后,我会告诉你可能是什么问题。我不知道的是解决方案。

widgetconfigure.xml

这是配置活动的布局。我不会发布这个 xml。它在布局中有文本视图。

widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="72dip"
    android:layout_height="72dip"
    android:layout_gravity="center"
    android:id="@+id/widgetlayout">

    <ImageView android:id="@+id/ImageView01"
     android:layout_width="72dip" 
     android:layout_height="72dip"
     android:scaleType="fitXY">
    </ImageView>

    <TextView
        android:id="@+id/tvConfigInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:gravity="left"
        android:textColor="#FFFFFF"
        android:layout_marginLeft="3dip"
        android:layout_marginRight="3dip"   
        android:textSize="12dip" />

</RelativeLayout>

我在其中注册配置活动和 appwidgetprovider 的清单的一部分:

   <activity
            android:name=".WidgetConfig"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>

        <receiver android:name=".MyWidgetProvider" android:label="@string/app_name">

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

xml/widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget_layout"
    android:minHeight="72dp"
    android:minWidth="72dp"
    android:configure="com.b2creative.notepad.WidgetConfig"> 
</appwidget-provider>

WidgetConfig.java

这是配置活动。用户从列表视图中选择小部件的背景和文本颜色以及要显示在小部件上的文本。我将只发布相关部分:

     AppWidgetManager awm;
        int awID;
        Intent i = getIntent();
        Bundle extras = i.getExtras();
        if (extras != null)
        {
            awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        }
        else
        {
            finish();
        }
        awm = AppWidgetManager.getInstance(c);


//the code from here is in a button onclicklistener that sets the widget.

            RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget_layout);
            views.setTextViewText(R.id.tvConfigInput, widgettext);
            views.setTextColor(R.id.tvConfigInput, loadedtextcolor);
            views.setFloat(R.id.tvConfigInput, "setTextSize", int_widgetfontsize);

            Paint p = new Paint(); 
            p.setAntiAlias(true);
            p.setStyle(Style.FILL);
            p.setColor(loadedbgcolor);
            Bitmap bitmap = Bitmap.createBitmap(GetDipsFromPixel(72), GetDipsFromPixel(72), Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            RectF rect = new RectF(0, 0, GetDipsFromPixel(72), GetDipsFromPixel(72));
            canvas.drawRoundRect(rect, 10, 10, p);
            views.setImageViewBitmap(R.id.ImageView01, bitmap);
            Intent in = new Intent(c, Notepad.class);
            PendingIntent pi = PendingIntent.getActivity(c, 0, in, 0);

            Intent result = new Intent();
            result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
            setResult(RESULT_OK, result);

            awm.updateAppWidget(awID, views);

            finish();

MyWidgetProvider.java

public class MyWidgetProvider extends AppWidgetProvider {

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

        super.onUpdate(context, appWidgetManager, appWidgetIds);
        final int N = appWidgetIds.length;
        for (int i=0; i<N; i++)
        {
            int awID = appWidgetIds[i];
            RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            //v.setTextViewText(R.id.tvConfigInput, "Something");
            appWidgetManager.updateAppWidget(awID, v);
        }
    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
    }

}

所以我很确定问题出在 onUpdate 方法中,因为我没有设置小部件的布局。我用 // 留下一行来显示是否添加它,我得到一个没有背景但带有文本“Something”的小部件。

我应该如何在这个方法中设置小部件的背景颜色、小部件的文本颜色和小部件上的 TextView 的文本?我不认识它们,用户在添加小部件时设置它们。或者我该怎么办?

编辑

我找到了this 代码并像这样修改了我的代码:

我添加了 saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext); 到 WidgetConfig.java 中的 onClick 方法,所以当用户在配置活动中按下 OK 时,widgettext 将与 appwidgetid 一起保存(Idk 什么 appwidgetid,因为代码使用 AppWidgetManager.INVALID_APPWIDGET_ID)。

为此,我需要这个:

  static void saveTitlePref(Context context, int appWidgetId, String text) {
            SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
            prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);
            prefs.commit();
        }

在 MyWidgetProvider 类中,我像这样修改了 for 循环:

final int N = appWidgetIds.length;
    for (int i=0; i<N; i++)
    {
        int awID = appWidgetIds[i];
        RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        //v.setTextViewText(R.id.tvConfigInput, "Something");
        v.setTextViewText(R.id.tvConfigInput, loadTitlePref(context, AppWidgetManager.INVALID_APPWIDGET_ID));
        appWidgetManager.updateAppWidget(awID, v);
    }

我添加的地方

  static String loadTitlePref(Context context, int appWidgetId) {
            SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
            String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
            String nothing = "empty";
            if (prefix != null) {
                return prefix;
            } else {
                return nothing;
            }
        }

它仍然不起作用,但越来越近了。我在主屏幕上放置了两个具有不同文本的小部件,然后我重新安装了该应用程序。现在两个小部件都有文本(当然,因为我设置了它),但它们具有相同的文本,即我为第二个小部件选择的文本。

请帮帮我。

【问题讨论】:

  • 没人?我不知道这是一个如此困难的问题。我看到具有许多不同用户设置小部件的应用程序,我该怎么办?
  • 我向任何告诉我如何处理用户在配置活动中设置的小部件的人提供 100 个积分。
  • 我对此一无所知,但只是作为一个想法,您是否在股票 Android 上尝试过?我之前在感觉方面遇到了一些类似的问题。这可能是一个特定的错误,只会误导您进入错误的方向
  • 我没试过,因为很难买到普通的安卓手机,但即使在普通安卓手机上运行流畅,我也不知道该怎么办
  • 使用模拟器进行股票测试。

标签: android widget


【解决方案1】:

如果图片存储到SD卡,这个帖子可能有答案:http://www.technipages.com/android-icons-disappear-from-home-screen.html

【讨论】:

  • 不,它不存储在 SD 卡上。它在应用程序中。
【解决方案2】:

一个好的方法是在 sharedPrefs 中映射/保存每个 Id。 更多信息在这里: Handling multiple instances of appwidget 和这里: http://www.androidbook.com/akc/display?url=DisplayNoteIMPURL&reportId=3307&downerUserId=satya

【讨论】:

    【解决方案3】:

    重新调整大小或移动小部件使其在一段时间后可见。为了解决这个问题,我在我的图像视图中放置了一个默认图像,它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2019-05-11
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多