从启动部件活动 [英] Launching activity from widget

查看:171
本文介绍了从启动部件活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做一些东西,真的应该是很容易的,但它的驾驶我疯了。我试图启动一个活动时,主屏幕widget是pressed,如窗口小部件的配置活动。我想我已经跟着一个字一个字的教程Android开发者网站上,甚至一些非官方的教程为好,但我一定是失去了一些东西,因为它不能正常工作非常重要。

I'm trying to do something which really ought to be quite easy, but it's driving me crazy. I'm trying to launch an activity when a home screen widget is pressed, such as a configuration activity for the widget. I think I've followed word for word the tutorial on the Android Developers website, and even a few unofficial tutorials as well, but I must be missing something important as it doesn't work.

下面是code:

public class VolumeChangerWidget extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
	final int N = appWidgetIds.length;

	for (int i=0; i < N; i++) {
		int appWidgetId = appWidgetIds[i];

		Log.d("Steve", "Running for appWidgetId " + appWidgetId);
		Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);
		Log.d("Steve", "After the toast line");

		Intent intent = new Intent(context, WidgetTest.class);

		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

		RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
		views.setOnClickPendingIntent(R.id.button, pendingIntent);

		appWidgetManager.updateAppWidget(appWidgetId, views);
	}
}

}

在添加小部件到主屏幕,显示的logcat两调试线,虽然不是吐司。 (任何想法,为什么不呢?)然而,更让人头疼的是,当我再点击与它相关的PendingIntent的按钮,没有任何反应都没有。我知道WidgetTest活动可以因为运行,如果我成立了一个Intent的主要活动中,它启动的罚款。

When adding the widget to the homescreen, Logcat shows the two debugging lines, though not the Toast. (Any ideas why not?) However, more vexing is that when I then click on the button with the PendingIntent associated with it, nothing happens at all. I know the "WidgetTest" activity can run because if I set up an Intent from within the main activity, it launches fine.

在情况下,重要的,这里是Android清单文件:

In case it matters, here is the Android Manifest file:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.steve"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Volume_Change_Program"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

	<activity android:name=".WidgetTest"
			  android:label="@string/hello">
		<intent_filter>
			<action android:name="android.intent.action.MAIN"/>
			<category android:name="android.intent.category.LAUNCHER"/>
		</intent_filter>
	</activity>

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

</application>
<uses-sdk android:minSdkVersion="3" />

有没有一种方法来测试何处有故障?即是错按钮没有正确连接到PendingIntent,或者说,PendingIntent或意图没有找到WidgetTest.class等?

Is there a way to test where the fault is? I.e. is the fault that the button isn't linked properly to the PendingIntent, or that the PendingIntent or Intent isn't finding WidgetTest.class, etc?

非常感谢您的帮助!

史蒂夫

推荐答案

我有同样的问题。我发现,解决办法是通过appwidget经理打电话的更新。这里是如何做到这一点的onEnabled一个例子。似乎它需要在两个onEnabled完成,onUpdated使得当设备上的点击意图供电也intialized - 在onUpdated的PARAMS已经提供参考经理,幸运

I was having the same issue. I discovered that the fix is to call an update through the appwidget manager. here is an example of how to do that in onEnabled. It appears it needs to be done in both onEnabled and onUpdated so that when device is powering on your click intent is also intialized - in onUpdated the params already provide the reference to the manager, luckily.

@Override 
    public void onEnabled(Context context) {  
          //Log.v("toggle_widget","Enabled is being called"); 

          AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
          //retrieve a ref to the manager so we can pass a view update 

          Intent i = new Intent(); 
          i.setClassName("yourdoman.yourpackage", "yourdomain.yourpackage.yourclass"); 
          PendingIntent myPI = PendingIntent.getService(context, 0, i, 0); 
          //intent to start service 

        // Get the layout for the App Widget 
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.togglelayout); 

        //attach the click listener for the service start command intent 
        views.setOnClickPendingIntent(R.id.toggleButton, myPI); 

        //define the componenet for self 
        ComponentName comp = new ComponentName(context.getPackageName(), ToggleWidget.class.getName()); 

        //tell the manager to update all instances of the toggle widget with the click listener 
        mgr.updateAppWidget(comp, views); 
} 

这篇关于从启动部件活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆