1

タブレット/電話の配線を避けるために、アクティビティ エイリアスを介してアプリ自体にインテントを発行し、マニフェスト システムがそれをメイン アクティビティ (タブレットの場合) または新しいアクティビティ (電話の場合) に配信するようにします。

マニフェストにこれがある場合:

<activity-alias android:name="my.app.WebContent"
              android:targetActivity="my.app.activities.Home"/>

その後、すべてが順調で、

Intent {
    act=android.intent.action.VIEW dat=http://www.app.my/url
    cmp=my.app/.WebContent (has extras) }

期待どおりに配信されます。

ただし、マニフェストにこれがある場合:

<activity-alias android:name="my.app.WebContent"
              android:enabled="@bool/has_one_pane"
              android:targetActivity="my.app.activities.WebContent"/>
<activity-alias android:name="my.app.WebContent"
              android:enabled="@bool/has_two_panes"
              android:targetActivity="my.app.activities.Home"/>

これをvalues/res.xmlに

<resources>
    <bool name="has_two_panes">false</bool>
    <bool name="has_one_pane">true</bool>
</resources>

これは、values-large/res.xml および values-sw600dp/res.xml にあります。

<resources>
    <item type="layout" name="content_frame">@layout/activity_item_twopane</item>
    <bool name="has_two_panes">true</bool>
    <bool name="has_one_pane">false</bool>
</resources>

次に、私のコードは、PackageManager.resolveActivity() に従って「配信不能」としてインテントを除外します。

大きいディスプレイでは values-large が values/res.xml をオーバーライドすることになっているにもかかわらず、values/res.xml が values-anything/res.xml をオーバーライドしているようです。

これは Android のバグですか、またはこれを行う方法を誤解していますか?

4

1 に答える 1

1

いいえ、画面の幅 (res/layout-w600dp) などは向きによって変わる可能性があるため、サポートされていませんが、Google は「最小幅」 (res/layout-sw600dp) が影響を受けないことに気付いていないようです。Fragment Orientation Changeを参照してください- ランドスケープよりも優れたテスト

また、名前 name のエイリアス間で一意に選択する ComponentName を構築できないため、Android の携帯電話またはタブレット専用のアクティビティを指定する方法で提案されている回避策は、競合する <activity-alias> では機能しないことに注意してください。

(対象となるアクティビティの 1 つだけを無効にし、マニフェスト内の順序に依存して代替案を切り替えることが可能である場合を除きますが、これには脆弱性の問題があります。)

于 2013-01-21T14:44:32.400 に答える