2

私はActivityシンプルなレイアウトを持っています。

アクティビティ:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.my_layout);

レイアウト:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.my.layout
        android:id="@+id/my_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.my.layout>

</FrameLayout>

マージタグで置き換えたいのですFrameLayoutが、結果として次のエラーが発生しますsetContentView:

01-25 17:08:24.660: E/AndroidRuntime(25837): 
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app/my.app.MyActivity}:
android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
4

2 に答える 2

1

不思議なことに、この振る舞いは普遍的に正しいとは思えません。<merge>エミュレーターまたは Nexus デバイスの 1 つで簡単な例を実行できます。アプリケーションは、階層のルートとしてタグを使用してメイン レイアウトを問題なく拡張できます。これを複数のデバイスで再現できますか?

技術的には、AOSP を一目見ただけで、特定の OEM がその動作を変更しない限り、この動作は AndroidWindowと実装では不可能です (Motorola はこれを行うことで悪名高い)。ActivityAOSP ソースでは:

  1. 例外は、親ビュー パラメーターLayoutInflater.inflate()で呼び出された場合にのみ発生します。null
  2. ActivitysetContentView()親に渡すだけWindow
  3. Windowコンテンツ ビューを親として呼び出しLayoutInflater.inflate()ます。この段階で null の場合RuntimeException、フレームワーク コードによって厄介なエラーがスローされます。

補足として、これはとにかくやりたいことではないかもしれません。階層内の一見役に立たないように見える親を置き換えたい理由は理解していますが、保証されることの 1 つは、アプリケーションがその親が何であるかを常に認識しているため、適切LayoutParamsに評価されることを期待できるということです。を使用する場合<merge>、階層のルート コンテンツ ビューは、デバイスの Android のバージョンに応じてFrameLayout、 、またはその他になる可能性があり、ルートが特定の方法で動作するLinearLayoutと予想される場合、これにより混乱を招く動作が発生する可能性があります。LayoutParams

于 2013-01-25T20:20:39.220 に答える
1

男、HoloEverywhere を削除してみてください。差し込みタグで問題が発生します。

于 2013-01-25T18:46:23.367 に答える