如何在Activity上调用widget(从Activity调用Widget)

时间:2011-08-15 06:24:52

标签: android android-widget

我是android widget的新手。我做了示例应用程序,想要显示时间。如何从活动中调用widget:

我试过这样但是它说引起:android.content.ActivityNotFoundException:无法找到显式活动类{com.weather/com.weather.CurrentCity};你有没有在AndroidManifest.xml中声明这个活动?

   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.weather"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="Weather">
    <!-- Broadcast Receiver that will process AppWidget updates -->
    <receiver android:name=".CurrentCity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/hello_widget_provider" />
    </receiver>

      <activity android:name=".WeatherActivity"
              android:label="Weather Application">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

<uses-permission android:name="android.permission.INTERNET" />

和我的初始活动:

 public class WeatherActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent showContent = new Intent(getApplicationContext(),CurrentCity.class);
    startActivity(showContent);
}

和我的小部件活动:

  public class CurrentCity extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
            1000);

}

private class MyTime extends TimerTask {
    RemoteViews remoteViews;
    AppWidgetManager appWidgetManager;
    ComponentName thisWidget;
    DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault());

    public MyTime(Context context, AppWidgetManager appWidgetManager) {
        this.appWidgetManager = appWidgetManager;
        remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.current_weather);
        thisWidget = new ComponentName(context, CurrentCity.class);
    }

    @Override
    public void run() {
        remoteViews.setTextViewText(R.id.country,"Time = " + format.format(new Date()));
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);
    }
}

}

我创建了main.xml&amp; current_weather.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" >

<TextView android:id="@+id/country" 
          android:text="TextView" 
          android:layout_height="wrap_content" 
          android:layout_width="wrap_content" 
          android:layout_margin="10dp"
          android:textColor="@color/solid_yellow"
    ></TextView>


</RelativeLayout>

我在res / xml / hello_widget_provider.xml中创建了hello_widget_provider.xml.xml

  <?xml version="1.0" encoding="utf-8"?>
  <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="10000"
android:initialLayout="@layout/main"
  />

请帮帮我

提前致谢

2 个答案:

答案 0 :(得分:4)

你想要做的事实际上是不可能的。你这样做:

Intent showContent = new Intent(getApplicationContext(),CurrentCity.class);
    startActivity(showContent);

您不能以这种方式调用窗口小部件:窗口小部件没有您可以显示的活动。

您需要密切关注http://developer.android.com/guide/topics/appwidgets/index.html上的教程:我真的没有简单的方法将您的代码转换为工作小部件,但指南中包含了您需要知道/做的所有事情一个工作小部件。

编辑:请注意,您的窗口小部件必须添加到窗口小部件容器(可能是主屏幕),并且无法以编程方式添加。 Android设备的用户必须手动执行此操作。

答案 1 :(得分:0)

我尝试以多种方式做到这一点。但是,在Android中没有意图或类似的替代方案,它可以通过活动调用小部件(我的意思是应用程序)。您必须拖动窗口小部件并将其放在主屏幕上。

但是,是的,其他方式是可能的!