4

無料と有料の2つのバージョンのアプリがありますが、コードを個別に管理しています。私はついにコードを両方が参照するライブラリに移動して、コードの保守を容易にしました。

変更するAppwidgetProviderとランチャーが既存のウィジェットを削除することがわかったので、ユーザーがウィジェットを再作成する必要がないように、プロバイダーを同じに保つためにそれらのクラスをライブラリから戻しました。ランチャーはウィジェットを削除しなくなりましたが、代わりに、更新後にウィジェットが表示されなくなりました。

いつものように、componentnameを呼び出すAppWidgetManager.getAppWidgetIdsと、appwidgetidはまだそこにあります。appwidgetproviderとサービスは引き続きウィジェットを更新するために呼び出され、ウィジェット/data/system/appwidgets.xmlは表示されますが、ランチャーはウィジェットを表示しません。

ウィジェットの場所を長押しすると壁紙チューザーが表示されるので、表示されないわけではありません。新しいウィジェットは問題なく作成できますが、ウィジェットの再作成をユーザーに依頼してイライラさせたくはありません。ログには、ランチャーまたはによってスローされたエラーは表示されませんAppwidgetService

ウィジェットが更新後にレンダリングを停止する理由はありますか?これは、コードの大部分を別のライブラリに移動することに何らかの形で関係しています。ありがとう!

編集:エミュレータ、APIレベル15、ストックランチャーでテストしています

4

1 に答える 1

0

OK、解決策を見つけましたが、それが何であるかにうんざりしています...

マニフェストで宣言されたクラスが変更されてはならない方法について読んだ後、マニフェスト内の各クラスをアプリ内のクラスとして作成し、ライブラリ内の対応するクラスを拡張しました。次に、forName を使用して、正しいクラスを含めるようにすべてのインテントを変更する必要がありました。したがって、このシナリオの例は次のとおりです。

アプリ パッケージ: com.sample.package

アクティビティ: MyActivity

ライブラリ: com.sample.package.core

アクティビティ: MyActivity

アプリには MyActivity があり、ライブラリには MyActivity があります。アプリの MyActivity は、単に com.sample.package.core.MyActivity を拡張したものです。

その後、発生した場合...

new Intent(context, MyActivity.class)

...ライブラリで...になる必要があります

new Intent(context, Class.forName(context.getPackageName() + "." + MyActivity.class.getSimpleName());

マニフェストでこれを行う方法がある場合は、お知らせください。

于 2012-06-13T19:13:40.103 に答える