【问题标题】:Homescreen Widget with Ionic cordova and the cordova-plugin-ace带有 Ionic cordova 和 cordova-plugin-ace 的主屏幕小部件
【发布时间】:2019-09-10 11:06:18
【问题描述】:

我想通过我的 Cordova 应用程序发送一个小部件。目前我只使用 Ionic 4 tabs 启动项目,并没有更改 src 上的任何数据。我刚刚添加了 ace-plugin 并在平台和本机文件夹中进行了更改(在底部进行了描述)。我做了一些关于创建小部件的教程 (https://www.codeproject.com/Tips/1218204/How-to-Create-an-Android-Application-Widget-using)。但毕竟我已经尝试过,小部件并没有出现在我手机的小部件列表中。

小部件需要用本机代码编写,所以我添加了 ace-plugin,它添加了一个名为“native”的文件夹。在此文件夹中可以编写本机代码,然后在构建时将其发送到 cordova 的平台文件夹。然后我按照上面的教程,在平台 Android Manifest 和本机 (ace) Android Manifest 中添加了小部件的接收器和服务。清单是唯一的,我在平台文件夹中进行了更改。在插件的本机文件夹中进行的所有其他更改。 我通过添加 list_widget_info.xml 为 res 文件夹中的小部件提供元数据,并通过将 list_widget_item.xml 和 list_widget_layout.xml 添加到布局文件夹来添加列表小部件的布局。我还在可绘制文件夹中提供了一个图像。作为 WidgetProvider,我将 ListWidgetProvider.java 添加到 src/io/ionic/starter 文件夹中。 构建后,本机文件夹中的所有内容都会以正确的方式传送到平台文件夹。

AndroidMaifest.xml(在创建的活动和'Ace-activity'之间

<receiver android:name="io.ionic.starter.ListWidgetProvider">
   <intent-filter>
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   </intent-filter>
   <meta-data android:name="android.appwidget.provider" android:resource="@xml/list_widget_info"/>
</receiver>
<service android:exported="false" android:name="run.ace.AppWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" />

ListWidgetProvider.java

package io.ionic.starter;

public class ListWidgetProvider extends run.ace.AppWidgetProvider {

   @Override
   protected int getLayoutResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_layout", "layout", context);
   }

   @Override
   protected int getViewResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_view", "id", context);
   }

   @Override
   protected int getItemResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item", "id", context);
   }

   @Override
   protected int getItemTextResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item_text", "id", context);
   }

   @Override
   protected int getItemLayoutResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item", "layout", context);
   }
}

list_widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="250dp"
  android:minHeight="40dp"
  android:resizeMode="horizontal|vertical"
  android:updatePeriodMillis="86400000"
  android:previewImage="@drawable/list_widget_preview"
  android:initialLayout="@layout/list_widget_layout">
</appwidget-provider>

list_widget_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_widget_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <TextView
    android:id="@+id/list_widget_item_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:textColor="#ffffff"
    android:textSize="40px" />
</FrameLayout>

list_widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_widget_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:loopViews="true" />

在我看来这可能是 android 清单中的一些错误,因为如果其他文件应该有错误,小部件应该显示在 Widgetlist 中,但不可用。

我的问题是:

  • 有没有人通过使用 ace-plugin 遇到同样的问题,并且知道在 widgetlist 中显示小部件的解决方案?
  • 是否有一些错误,我没有看到,可能在本机代码中生成一个小部件?
  • 我的方法是否正确,这个错误应该取决于 Android Manifest?
  • 我可以在手机上运行我的应用程序后的某处显示 android 清单吗?

我很高兴我可以遵循每一个提示来解决这个问题。感谢您的帮助:)

【问题讨论】:

  • 谢谢,我会试试的。因为我希望在我的应用程序中有原生的感觉..

标签: android ionic-framework widget cordova-plugins android-manifest


【解决方案1】:

所以至少我有一些改进。我发现,我的项目并没有真正使用platforms/android 文件夹中的AndroidManifest,而是使用platforms/android/app 中的AndroidManifest。因此,因此,如果我手动复制我在 app 文件夹中的问题中提供的所有文件,它会按照教程的预期工作。 我还需要导入在 index.html 中添加插件的文件(cordova.js)。通常这应该使用 create 命令生成...

另外,如果我想在 Widget 中使用 Listview,提供的 WidgetService 对我不起作用。因此,我将其从 AndroidManifest 中删除并使用我自己的服务,就像在本机应用程序中一样。因此 android.appwidget 不起作用,但是我也可以通过“手动”调用它来使用它。

我已经得到了这个小部件,但仍然有一些问题,为什么它需要在platforms/android/app 文件夹中并且如果我将它复制到它之外就不会使用它......

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2020-08-24
    • 2022-12-14
    • 2022-01-13
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多