当前位置: 编程技术>移动开发
本页文章导读:
▪You must supply a layout_height attribute You must supply a layout_height attribute.
我需要设置全屏 但还要保存标题栏 所以我在style文件中定义了样式
<style name="Theme_NoTitle_FullScreen">
<item name="android:windowNoTitle">false</item>.........
▪ 列脱手机中所有的App,点击启动 列出手机中所有的App,点击启动
Main layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
a.........
▪ appWidget(学习1) appWidget(学习一)
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。.........
[1]You must supply a layout_height attribute
来源: 互联网 发布时间: 2014-02-18
You must supply a layout_height attribute.
。。。去年的问题了 我都忘了这个问题后来解决么有:x
我需要设置全屏 但还要保存标题栏 所以我在style文件中定义了样式
<style name="Theme_NoTitle_FullScreen">
<item name="android:windowNoTitle">false</item>
<item name="android:windowFullscreen">true</item>
</style>
并在mf文件中的application中设置
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:theme="@style/Theme_NoTitle_FullScreen">
启动程序就有如下错误
05-15 09:50:25.908: WARN/WindowManager(182): HistoryRecord{407720c0 com.yy/.MainActivity} failed creating starting window
05-15 09:50:25.908: WARN/WindowManager(182): java.lang.RuntimeException: Binary XML file line #25: You must supply a layout_height attribute.
05-15 09:50:25.908: WARN/WindowManager(182): at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:3599)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:3678)
05-15 09:50:25.908: WARN/WindowManager(182): at android.widget.LinearLayout$LayoutParams.<init>(LinearLayout.java:1400)
05-15 09:50:25.908: WARN/WindowManager(182): at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1326)
05-15 09:50:25.908: WARN/WindowManager(182): at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:47)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.LayoutInflater.rInflate(LayoutInflater.java:625)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
05-15 09:50:25.908: WARN/WindowManager(182): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2228)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2283)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.internal.policy.impl.PhoneWindow.getDecorView(PhoneWindow.java:1449)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.internal.policy.impl.PhoneWindowManager.addStartingWindow(PhoneWindowManager.java:1059)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.server.WindowManagerService$H.handleMessage(WindowManagerService.java:7878)
05-15 09:50:25.908: WARN/WindowManager(182): at android.os.Handler.dispatchMessage(Handler.java:99)
05-15 09:50:25.908: WARN/WindowManager(182): at android.os.Looper.loop(Looper.java:123)
05-15 09:50:25.908: WARN/WindowManager(182): at com.android.server.WindowManagerService$WMThread.run(WindowManagerService.java:557)
不明白为什么会这样
1 楼
wei705026811
2012-04-17
layout_height有没有在布局文件里 或者前面有加android吗?androiod:layout_height
2 楼
zhouxiaoli521
2012-04-17
wei705026811 写道
layout_height有没有在布局文件里 或者前面有加android吗?androiod:layout_height
。。。去年的问题了 我都忘了这个问题后来解决么有:x
[2] 列脱手机中所有的App,点击启动
来源: 互联网 发布时间: 2014-02-18
列出手机中所有的App,点击启动
Main layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dip" android:gravity="center_vertical|center_horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择安装文件" /> </LinearLayout> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/list" /> </LinearLayout>
Item Layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="80dip"> <LinearLayout android:layout_width="240dip" android:layout_height="40dip" android:gravity="left"> <TextView android:text="appName: " android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <TextView android:id="@+id/appname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="1" android:marqueeRepeatLimit="marquee_forever" android:ellipsize="marquee" android:maxWidth="100dip" android:layout_gravity="center_vertical" /> </LinearLayout> <LinearLayout android:layout_width="120dip" android:layout_height="40dip" android:layout_gravity="right"> <Button android:id="@+id/btn" android:layout_width="80dip" android:layout_height="40dip" android:text="打开" android:layout_gravity="center_vertical" /> </LinearLayout> </LinearLayout>
TestActivity
package com.nico;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class TestActivity extends Activity {
public List<ApplicationInfo> applist = null;
public ListView list = null;
public LayoutInflater inflater = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView) findViewById(R.id.list);
myAdapter madapter = new myAdapter();
inflater = getLayoutInflater();
applist = this.getPackageManager().getInstalledApplications(0);
list.setAdapter(madapter);
// getPackageManager().getInstalledPackages(0)
}
public class myAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return applist.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return applist.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
TextView txt = null;
if (convertView != null) {
txt = (TextView) convertView.findViewById(R.id.appname);
txt.setText(applist.get(position).loadLabel(
TestActivity.this.getPackageManager()));
} else {
convertView = inflater.inflate(R.layout.item, null);
txt = (TextView) convertView.findViewById(R.id.appname);
// Log.v("Test",
// "2 "+applist.get(position).loadLabel(TestActivity.this.getPackageManager()));
txt.setText(applist.get(position).loadLabel(
TestActivity.this.getPackageManager()));
}
Button btn = (Button) convertView.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getPackageManager()
.getLaunchIntentForPackage(
applist.get(position).packageName);
TestActivity.this.startActivity(intent);
}
});
return convertView;
}
}
}
[3] appWidget(学习1)
来源: 互联网 发布时间: 2014-02-18
appWidget(学习一)
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。
AppWidget的实现主要涉及到以下类:
AppWidgetProvider
RemoteViews
AppWidgetManager
1.
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。
2.
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。
如果使用的是Eclipse可按如下操作:
1) 在res/目录下创建xml/目录
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider
3)在弹出的便捷界面进行参数设置
主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)
*Widget大小的计算单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白
一个完整的样例:
1. <?xml version="1.0" encoding="utf-8"?>
2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
3. android:minWidth="80dp"
4. android:minHeight="32dp"
5. android:updatePeriodMillis="86400000"
6. android:initialLayout="@layout/widget_provider"
7. android:configure="com.demo.widget.MyWidgetConfiguration" >
8. </appwidget-provider> <br>
《greenboy:我在进行验证的时候,若是在创建好XML文件后,的、在写属性的时候,是不会出现提示信息的,比较郁闷,其它layout文件下的布局文件都是出提示信息的,看了一下appwidget好像就五个属性,然后就没有其它属性了》
3.
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个 BroadcastReceiver,里面提供了以下函数:
onReceive(Context, Intent)
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)
onEnabled(Context)
onDeleted(Context, int[] appWidgetIds)
onDisabled(Context)
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。
以上函数具体调用情况归纳如下:
[启动 - 无confiure Activity]
onReceive
onEnabled —— 第一个widget被显示
onReceive
onUpdate —— 刷新界面
[启动 - 带confiuration Activity]
onReceive
onUpdate
[拖动]
<无状态变化>
[周期更新]
onReceive
onUpdate
[删除]
onReceive
onDeleted —— widget被删除
onReceive
onDisabled —— 最后一个widget被移除
[启动时位置不够]
onReceive
onEnabled
onReceive
onUpdate
onReceive
onDeleted
onReceive
onDisabled
*每次状态的变化会触发 onReceive,一般该函数是不需要重写的。
简单了解AppWidgetProvider之后,我们来看具体实现。
这里创建一个MyAppWidgetProvider继承AppWidgetProvider:
Java代码
public class MyWidgetProvider extends AppWidgetProvider {
static final String TAG = "widget";
/**
* 更新
*/
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
Log.i(TAG, "onUpdate");
}
/**
* 第一个Widget组件启动时触发
*/
public void onEnabled(Context context){
Log.i(TAG, "onEnabled");
}
/**
* 最后一个Widget组件关闭时触发
*/
public void onDisabled(Context context){
Log.i(TAG, "onDisabled");
}
/**
* 任一Widget组件被删除时触发
*/
public void onDeleted(Context context, int[] appWidgetIds){
Log.i(TAG, "onDeleted");
}
/**
* 以上函数触发前会先触发该函数,一般不需要重写
*/
public void onReceive(Context context, Intent intent){
Log.i(TAG, "onReceive");
super.onReceive(context, intent);
}
}
其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下:
Java代码
public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){
int N = appWidgetIds.length; // 可能启动了多个Widget,appWidgetIds记录了这些Widget的ID
for(int i=0; i<N; i++){
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_views);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
}
《greenboy:下面的还没有进行验证,暂时需要看其它文档,马上回来验证下。》
其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。具体可参考AppWidget RemoteViews 内存溢出 。
其他函数的可以根据需要实现。
由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有:
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
setProgressBar(int viewId, int max, int progress, boolean indeterminate)
setTextViewText(int viewId, CharSequence text)
setViewVisibility(int viewId, int visibility)
详细函数列表可参考API中的RemoteViews 类 。
4.
最后,更新AndroidManifest.xml。
AppWidgetProvider对应一个receiver属性:
Xml代码
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</receiver>
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</receiver>
5.
提供Configuration Activity
Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。
在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。
需要注意的是,
如果设置了Configure属性,则必须在指定的Activity中进行如下处理:
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE) ,这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动;
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的 Widget:
Java代码
int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
否则会导致退出Activity后Widget不启动。
>> Widget创建步骤汇总:
1.定义Widget布局XML -> res/layout/...
2.定义Widget属性文件(xml) -> res/xml/...
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action为 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>标识:
Xml代码
<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>
<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>
4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。
AppWidget的实现主要涉及到以下类:
AppWidgetProvider
RemoteViews
AppWidgetManager
1.
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。
2.
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。
如果使用的是Eclipse可按如下操作:
1) 在res/目录下创建xml/目录
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider
3)在弹出的便捷界面进行参数设置
主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)
*Widget大小的计算单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白
一个完整的样例:
1. <?xml version="1.0" encoding="utf-8"?>
2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
3. android:minWidth="80dp"
4. android:minHeight="32dp"
5. android:updatePeriodMillis="86400000"
6. android:initialLayout="@layout/widget_provider"
7. android:configure="com.demo.widget.MyWidgetConfiguration" >
8. </appwidget-provider> <br>
《greenboy:我在进行验证的时候,若是在创建好XML文件后,的、在写属性的时候,是不会出现提示信息的,比较郁闷,其它layout文件下的布局文件都是出提示信息的,看了一下appwidget好像就五个属性,然后就没有其它属性了》
3.
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个 BroadcastReceiver,里面提供了以下函数:
onReceive(Context, Intent)
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)
onEnabled(Context)
onDeleted(Context, int[] appWidgetIds)
onDisabled(Context)
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。
以上函数具体调用情况归纳如下:
[启动 - 无confiure Activity]
onReceive
onEnabled —— 第一个widget被显示
onReceive
onUpdate —— 刷新界面
[启动 - 带confiuration Activity]
onReceive
onUpdate
[拖动]
<无状态变化>
[周期更新]
onReceive
onUpdate
[删除]
onReceive
onDeleted —— widget被删除
onReceive
onDisabled —— 最后一个widget被移除
[启动时位置不够]
onReceive
onEnabled
onReceive
onUpdate
onReceive
onDeleted
onReceive
onDisabled
*每次状态的变化会触发 onReceive,一般该函数是不需要重写的。
简单了解AppWidgetProvider之后,我们来看具体实现。
这里创建一个MyAppWidgetProvider继承AppWidgetProvider:
Java代码
public class MyWidgetProvider extends AppWidgetProvider {
static final String TAG = "widget";
/**
* 更新
*/
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
Log.i(TAG, "onUpdate");
}
/**
* 第一个Widget组件启动时触发
*/
public void onEnabled(Context context){
Log.i(TAG, "onEnabled");
}
/**
* 最后一个Widget组件关闭时触发
*/
public void onDisabled(Context context){
Log.i(TAG, "onDisabled");
}
/**
* 任一Widget组件被删除时触发
*/
public void onDeleted(Context context, int[] appWidgetIds){
Log.i(TAG, "onDeleted");
}
/**
* 以上函数触发前会先触发该函数,一般不需要重写
*/
public void onReceive(Context context, Intent intent){
Log.i(TAG, "onReceive");
super.onReceive(context, intent);
}
}
其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下:
Java代码
public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){
int N = appWidgetIds.length; // 可能启动了多个Widget,appWidgetIds记录了这些Widget的ID
for(int i=0; i<N; i++){
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_views);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
}
《greenboy:下面的还没有进行验证,暂时需要看其它文档,马上回来验证下。》
其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。具体可参考AppWidget RemoteViews 内存溢出 。
其他函数的可以根据需要实现。
由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有:
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
setProgressBar(int viewId, int max, int progress, boolean indeterminate)
setTextViewText(int viewId, CharSequence text)
setViewVisibility(int viewId, int visibility)
详细函数列表可参考API中的RemoteViews 类 。
4.
最后,更新AndroidManifest.xml。
AppWidgetProvider对应一个receiver属性:
Xml代码
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</receiver>
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</receiver>
5.
提供Configuration Activity
Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。
在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。
需要注意的是,
如果设置了Configure属性,则必须在指定的Activity中进行如下处理:
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE) ,这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动;
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的 Widget:
Java代码
int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
否则会导致退出Activity后Widget不启动。
>> Widget创建步骤汇总:
1.定义Widget布局XML -> res/layout/...
2.定义Widget属性文件(xml) -> res/xml/...
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action为 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>标识:
Xml代码
<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>
<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>
4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter
最新技术文章: