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
中才能正确膨胀嵌套布局,成本模块化(也许有一天它会成为一个全屏视图)。