Android 膨胀包含自定义小部件嵌套布局定义的布局

Android 膨胀包含自定义小部件嵌套布局定义的布局,android,Android,我试图通过将复杂视图的布局整合到一个文件中来重构它 目前我有一个对话框片段,自定义视图对话框,它只是一个文本视图的线性布局,作为标题,还有一个自定义视图 CustomViewDialog.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/dialog" > <TextView android:id="@+id/dialog_title_tv"/>

我试图通过将复杂视图的布局整合到一个文件中来重构它

目前我有一个
对话框片段
自定义视图对话框
,它只是一个
文本视图的
线性布局
,作为标题,还有一个
自定义视图

CustomViewDialog.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >  

  <TextView android:id="@+id/dialog_title_tv"/>   

  <!--CustomView (added from code) -->

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<CustomView android:id="@+id/custom_view">  
    <ListView android:id="@+id/custom_view_lv" />   
</CustomView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >

  <TextView android:id="@+id/dialog_title"/>

  <!--CustomView "stub" (body defined within xml) -->
  <CustomView android:id="@+id/custom_view"/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--CustomView "body" -->
<ListView android:id="@+id/custom_view_list_lv" />
自定义视图
的构造函数依次膨胀其布局并初始化其视图

public class CustomView : LinearLayout
{
    View _thisView;

    public CustomView( Context context ) : base(context) 
    { 
        _thisView = _inflater.Inflate( Resource.Layout.CustomView, this, true );    
    }
}

我正试图像这样组合两个布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >

  <TextView android:id="@+id/dialog_title"/>

  <!--CustomView (defined within xml -->  
  <CustomView android:id="@+id/custom_view">      
    <ListView android:id="@+id/custom_view_list_lv" />      
  </CustomView>

</LinearLayout>
自定义视图
现在在
自定义视图对话框
中膨胀,因此我尝试将
\u此视图
分配给
,但效果不理想

public class CustomView : LinearLayout
{
    View _thisView;

    //public CustomView( Context context ) : base(context) 
    public CustomView(Context context, IAttributeSet attributes) : base(context, attributes)
    { 
        //_thisView = _inflater.Inflate( Resource.Layout.CustomView, this, true );  
        // DOESN'T WORK
        _thisView = this;
        _thisView = ((Activity)context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
    }
}
我不确定在
构造函数中获取对已构建视图的引用的最佳方法。
不再有自己的可膨胀布局文件

因为这里的
上下文
是一个
上下文包装器
(来自对话框),
窗口
getWindow()
)不可用
getWindow()
只是一个
活动
方法(顺便说一句,它是
ContextThemeWrapper
的直接后代)


更新(2017年10月19日)

Fragment
source()中找到有用的注释


修改
CustomView
的布局,使其包含“主体”,然后在
CustomView对话框的布局中只保留“存根”,给出:

CustomViewDialog.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >  

  <TextView android:id="@+id/dialog_title_tv"/>   

  <!--CustomView (added from code) -->

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<CustomView android:id="@+id/custom_view">  
    <ListView android:id="@+id/custom_view_lv" />   
</CustomView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >

  <TextView android:id="@+id/dialog_title"/>

  <!--CustomView "stub" (body defined within xml) -->
  <CustomView android:id="@+id/custom_view"/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--CustomView "body" -->
<ListView android:id="@+id/custom_view_list_lv" />
CustomView
的构造函数现在像往常一样对其(修改的)布局进行充气

public class CustomView : LinearLayout
{
    View _thisView;

    //public CustomView( Context context ) : base(context) 
    public CustomView(Context context, IAttributeSet attributes) : base(context, attributes)
    { 
        _thisView = _inflater.Inflate( Resource.Layout.CustomView, this, true );    
    }
}

修改
CustomView
的布局,使其包含“主体”,然后在
CustomView对话框的布局中只保留“存根”,给出:

CustomViewDialog.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >  

  <TextView android:id="@+id/dialog_title_tv"/>   

  <!--CustomView (added from code) -->

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<CustomView android:id="@+id/custom_view">  
    <ListView android:id="@+id/custom_view_lv" />   
</CustomView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/dialog" >

  <TextView android:id="@+id/dialog_title"/>

  <!--CustomView "stub" (body defined within xml) -->
  <CustomView android:id="@+id/custom_view"/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--CustomView "body" -->
<ListView android:id="@+id/custom_view_list_lv" />
CustomView
的构造函数现在像往常一样对其(修改的)布局进行充气

public class CustomView : LinearLayout
{
    View _thisView;

    //public CustomView( Context context ) : base(context) 
    public CustomView(Context context, IAttributeSet attributes) : base(context, attributes)
    { 
        _thisView = _inflater.Inflate( Resource.Layout.CustomView, this, true );    
    }
}

我不确定布局是否被单独的视图使用,或者是否打算被单独的视图使用,因为它们在活动中(活动是视图的集合)。我不确定这是否适用于所有内置,因此需要验证源代码。
TextView
接受一个属性集并使用该属性集,它本身不会膨胀布局。虽然我在定义自定义视图时就是这样做的,但这似乎有点滥用。当自定义视图/小部件的布局定义嵌套在另一个布局中时,膨胀变得不一致b/c嵌套视图现在依赖于正在构建中的包含视图。没有膨胀视图可调用
findViewById()
来初始化其组件(从
CustomView(上下文上下文上下文,IAttributeSet属性)
。必须将
CustomView
中的所有逻辑移到
CustomViewDialog
中才能正确膨胀嵌套布局,成本模块化(也许有一天它会成为一个全屏视图)。我不确定布局是否会被单个视图使用,或者是否会被单个视图使用,因为它们在活动中(活动是视图的集合)。我不确定这是否适用于所有内置,因此需要验证源代码。
TextView
接受一个属性集并使用该属性集,它本身不会膨胀布局。虽然我在定义自定义视图时就是这样做的,但这似乎有点滥用。当自定义视图/小部件的布局定义嵌套在另一个布局中时,膨胀变得不一致b/c嵌套视图现在依赖于正在构建中的包含视图。没有膨胀视图可调用
findViewById()
来初始化其组件(从
CustomView(上下文上下文上下文,IAttributeSet属性)
。必须将
CustomView
中的所有逻辑移到
CustomViewDialog
中才能正确膨胀嵌套布局,成本模块化(也许有一天它会成为一个全屏视图)。