旋转屏幕时,按钮在小部件上单击丢失

时间:2010-11-22 16:46:21

标签: android android-widget widget

我有一个非常简单的小部件应用程序,它由LinearLayout个背景和ImageButton组成。

AppWidgetProvider onUpdate()方法中,我注册了按钮的点击以广播意图。当小部件首次加载时,一切运行正常并且捕获点击。旋转屏幕时会出现问题,即使屏幕旋转回来也不会再次捕获点击。

屏幕旋转时,如何重新注册点击?

下面是我正在使用的一些代码段。

的AppWidgetProvider

@Override
public void onReceive(Context context, Intent intent)    
{
    super.onReceive(context, intent);

    if(intent.getAction().equals("test.CLICK"))
    {
        CallTestMethod(context);
    }
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];

        RemoteViews views=new RemoteViews(context.getPackageName(), R.layout.widget);            
        Intent clickintent=new Intent("test.CLICK");
        PendingIntent pendingIntentClick=PendingIntent.getBroadcast(context, 0, clickintent, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.change_mode, pendingIntentClick);
        SetInitialLayout(context);
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

清单

<receiver android:name=".Widget" android:label="@string/widget_name">
        <intent-filter>
            <action android:name="android.appwidget.action.ACTION_APPWIDGET_CONFIGURE" />
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="test.CLICK" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_mode_switcher" />            
    </receiver>

布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget_layout"
    android:layout_width="140dip"
    android:layout_height="140dip"
    android:scaleType="fitCenter"
    android:orientation="vertical"
    android:background="@drawable/background">
    <ImageButton
        android:id="@+id/change_mode"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="fitCenter"
        android:orientation="vertical"
        android:src="@drawable/none_selected"
        android:background="@null"
        android:clickable="true" />
</LinearLayout>

感谢任何人的帮助!

5 个答案:

答案 0 :(得分:4)

这帮助了我:Android widget ImageButton loses image when screen is rotated

简而言之,您必须在每次调用awm.updateAppWidget之前注册点击次数(views.setOnClickPendingIntent)

答案 1 :(得分:1)

我使用了一个需要在widgetapp上提供服务的解决方案,因为它可以处理widgetapp的方向更改。不幸的是,onReceive或onUpdate不会被方向更改调用,但是服务的onConfigurationChanged会被调用。您需要不断运行服务以检测这些方向。当服务检测到方向更改时,您将继续更改远程视图。

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  context.startService(new Intent(context, MyUpdateService.class));
 }

这是您需要实现的服务类。如果您需要有关该服务的更多信息,可以查看此信息。 http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html

 public static class MyUpdateService extends Service 
 { 
  @Override
  public void onCreate() {
   super.onCreate();
  }

  @Override
  public void onDestroy() {
   super.onDestroy();
  }

  @Override 
  public void onStart(Intent intent, int startId) 
  { 
   super.onStart(intent, startId); 
   // Update the widget 
   RemoteViews remoteView = buildRemoteView(this); 

   // Push update to homescreen 
   pushUpdate(remoteView); 

             } 

  public RemoteViews buildRemoteView(Context context) 
  { 
   int layoutID = R.layout.widget;
   if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
    layoutID = R.layout.widget_landscape;
   }
                                    //Here is where you set your onclick listeners again since the remote views need to be refreshed/recreated
   RemoteViews updateView = new RemoteViews(context.getPackageName(),layoutID); 
   // Create an Intent to launch ExampleActivity
   Intent intent = new Intent(this, yourAndroidActivity.class);
   PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
     intent, 0);

   updateView.setOnClickPendingIntent(R.id.yourClickableViewHere, pendingIntent);

   return updateView; 
  } 

  @Override 
  public void onConfigurationChanged(Configuration newConfig) 
  { 
   RemoteViews remoteView = buildRemoteView(this); 
    // Push update to home screen 
   pushUpdate(remoteView); 
  } 

  private void pushUpdate(RemoteViews updateViews) 
  { 
   ComponentName myWidget = new ComponentName(this, YourAppWidget.class); 
   AppWidgetManager manager = AppWidgetManager.getInstance(this); 

                                    //This is where you can update your remoteViews
   updateViews.setTextViewText(R.id.YOUR_TEXTVIEW_ON_WIDGET, "" + "TEXT THAT WILL SHOW UP");
   manager.updateAppWidget(myWidget, updateViews); 
  }

 } 
}

答案 2 :(得分:0)

据我所知,Android每次旋转屏幕时都会实际杀死并重新创建您的活动。哎呀,我知道。

所以无论如何,我怀疑如果你把log语句放在所有不同的生命周期回调中,你会发现只更新一次。您可能需要处理侦听另一个回调中的点击。没有检查一些参考资料我无法告诉你哪一个。我将把它作为练习留给读者。

答案 3 :(得分:0)

干草你有没有用过 机器人:configChanges = “keyboardHidden |方向”
使用Androidmanifest文件中的Activity。

答案 4 :(得分:-1)

我是android的新手,但我相当肯定这样做会有效。

@Override
public void onReceive(Context context, Intent intent)    
{
    super.onReceive(context, intent);
    if(intent.getAction().equals("test.CLICK"))
    {
        getIntent().putExtra("Just received click", true);
        CallTestMethod(context);
    }
}

然后在onCreate中,您可以通过检查getIntent().getBooleanExtra("Just received click", false)来查看它是否应该重新创建click事件(false指的是默认值。如果该代码返回true,那么上面的代码完成了它的工作,您应该重新创建点击事件)

这应该有效,因为即使您的应用被临时杀死,也会保存intent对象(及其附加内容)。意图将接受任何Serializable额外。