主屏幕小部件不会出现在android中

时间:2012-09-06 07:24:03

标签: android android-appwidget

在我的应用程序中,我有Fragment附加到主activity。此Fragmentadapter的帮助下显示数据。在adapter中,我夸大了一个layout,其中有一个clickable text“Watch From Home”。 adapter显示来自服务器的数据。我想在主屏幕上显示相同的数据,当我点击“从主页观看”文本时,应该创建一个主屏幕widget而无需任何用户交互。

我制作了一个receiver MyWidgetProvider。“Watch From Home”的方法onClickText()应该怎样才能让我看到小部件?我必须承认,我是android新手。感谢

Android清单文件

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

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <receiver android:name="MyWidgetProvider" >
            <intent-filter >
                <action 
                    android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

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

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

</manifest> 

MyWidgetProvider.Java文件

public class MyWidgetProvider extends AppWidgetProvider {

    private TextView team1Name;
    private TextView team2Name;
    private TextView team1Score;
    private TextView team2Score;

    public static boolean widgetView=false;
      private static final String LOG = "com.playup.android.receiver";

      public MyWidgetProvider(TextView team1Name, TextView team2Name, TextView team1Score, TextView team2Score){
          this.team1Name=team1Name;
          this.team2Name=team2Name;
          this.team1Score=team1Score;
          this.team2Score=team2Score;
          initializeViews();
      }

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

        Log.w(LOG, "onUpdate method called");
        // Get all ids
        ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        // Build the intent to call the service
        Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);

        // Update the widgets via the service
        context.startService(intent);
      }

      public void initializeViews(){
    //    team1Name= (TextView)content_layout.findViewById(R.id.team1Name);

      }
} 

UpdateWidgetService

public class UpdateWidgetService extends Service {
  private static final String LOG = "com.playup.android.receiver";

  @Override
  public void onStart(Intent intent, int startId) {
    Log.i(LOG, "Called");
    // Create some random data

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
        .getApplicationContext());

    int[] allWidgetIds = intent
        .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

    ComponentName thisWidget = new ComponentName(getApplicationContext(),
        MyWidgetProvider.class);
    int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);
    Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length));
    Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length));

    for (int widgetId : allWidgetIds) {
      // Create some random data
      int number = (new Random().nextInt(100));

      RemoteViews remoteViews = new RemoteViews(this
          .getApplicationContext().getPackageName(),0x7f030061);        //Since R could not be resolve, I used the generated ids
      Log.w("Widget", String.valueOf(number));
      // Set the text
      remoteViews.setTextViewText(0x7f0a022a,"Random: " + String.valueOf(number));

      // Register an onClickListener
      Intent clickIntent = new Intent(this.getApplicationContext(),MyWidgetProvider.class);

      clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
      clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
          allWidgetIds);

      PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
      remoteViews.setOnClickPendingIntent(0x7f0a022a, pendingIntent);
      appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
    stopSelf();

    super.onStart(intent, startId);
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

3 个答案:

答案 0 :(得分:1)

简单地说,您无法在没有任何用户交互的情况下创建主页小部件。


更新

您的接收器标签应如下所示:

<receiver
    android:name=".MyWidgetProvider" 
    android:label="My widget label" >
    <!-- The rest as is -->

</receiver>

答案 1 :(得分:1)

主屏幕小部件只能由用户直接添加到主屏幕。只有用户可以将小部件作为访客添加到主屏幕或其他应用程序。

修改

要在小部件列表中查看小部件:

  1. 必须在清单中注册AppWidgetProvider
  2. 您的应用必须具有 Launcher/Main活动,并且必须由用户直接运行,然后才能在窗口小部件列表中显示。这是必要的,因为没有broadcastreceiver (并且没有AppWidgetProvider),没有service,...您的应用程序无法在您的应用程序直接由用户运行之前注册。如果您查看清单,您将看到您的应用程序没有 { {1}}活动(它只有一个接收者),因此无法由用户运行,您的AppWidgetProvider(即广播接收者)将无法注册,因此您无法在小部件列表中看到您的小部件。

答案 2 :(得分:0)

这让我挠了一会儿。 我将meta-data标记作为intent-filter标记的子标记,这是错误的。 meta-data应为receiver代码的子代。

版本不正确

 <receiver
            android:name=".AppWidgetReceiver"
            android:label="AppWidgetReceiver" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

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

以下是正确的版本

<receiver android:name=".AppWidgetReceiver"
            android:label="AppWidgetReceiver" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

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