我在使用Xamarin Forms创建小部件配置活动时遇到了麻烦。我认为正在进行的工作是,在编译时,包的名称将被主要活动之类的随机#/ string所代替。但是,如果检查生成的APK,则可以看到<appwidget-provider ... android:configure="my.package.myClass".../>
没有更新。我认为应该是<appwidget-provider ... android:configure="randomstring.myClass".../>
。因此,我认为这可以防止配置屏幕出现。有没有一种方法可以强制使用Xamarin更新此属性上的包名称?还是有办法在小部件放置期间调用该属性之前在代码中设置此属性?
这是我的配置(软件包名称已简化以帮助调试):
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="288dip"
android:minHeight="72dip"
android:resizeMode="horizontal"
android:minResizeWidth="144dip"
android:updatePeriodMillis="1000"
android:initialLayout="@layout/Widget"
android:previewImage="@drawable/previewImage"
android:configure="quickclip.QuickClipConfigActivity"
/>
namespace quickclip
{
[Activity(Label = "QuickClipConfigActivity", Name= "quickclip.QuickClipConfigActivity", Exported=true )]
[IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_CONFIGURE" })]
public class QuickClipConfigActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Setup);
SetResult(Result.Canceled);
// Create your application here
}
}
}
[Activity]属性的名称字段仅出于调试目的而添加。有或没有它,放置窗口小部件都不会显示配置屏幕,也不会输入活动类(由断点验证),也不显示窗口小部件。但是,如果删除android:configure="my.package.myClass"
,则可以使小部件正常显示。
如果未明确指定,则Xamarin.Android将计算一些MD5,并使用该MD5为所有Android Callable Wrappers命名空间添加该MD5作为前缀。
为了避免您可以在类型上使用RegisterAttribute
:
[Register("my.cool.namespace.MyType")]
public class MyType : SomeJavaType
{
}
对于Activity
或Service
,您可以像这样使用Name
或ActivityAttribute
中的ServiceAttribute
属性:
[Activity(Label = "My Activity", Name = "my.cool.namespace.MyActivity")]
public class MyActivity : Activity
{
}
或者您可以将ActivityAttribute
与RegisterAttribute
组合在一起:
[Register("my.cool.namespace.MyActivity")]
[Activity(Label = "My Activity")]
public class MyActivity : Activity
{
}
这应该会在您的AndroidManifest中产生一个不错的条目,可以从布局文件或其他Apps / Widgets中轻松使用。