在基于 holder Activity 的 Fragment 中的 CustomView inflation 之前传递属性
Pass Attributes before CustomView inflation in Fragment based on holder Activity
我有一个 Fragment,它在布局中包含一个 custom/compound 视图。
<app.view.ControlLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/controlLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_control_size"
android:layout_marginBottom="@dimen/offset_distance"
custom:horizontal="true" />
片段已附加到布局中的不同活动,例如:
<fragment
android:id="@+id/controlLayout"
android:name="app.controllers.ControlFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_control_size"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/offset_distance"
tools:layout="@layout/fragment_control" />
自定义视图具有以下属性:
<resources>
<declare-styleable name="ControlLayout">
<attr name="horizontal" format="boolean" />
<attr name="callBtnVisibility" format="boolean" />
</declare-styleable>
</resources>
基于 Activity 我的控制片段所附加的,我想将 callBtnVisibility 属性传递给我的自定义视图。一种解决方案是在不使用属性的情况下在代码中处理登录:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_control, container, false);
if (getActivity() instanceof MyActivity) {
((ControlLayout) view.findViewById(R.id.controlLayout)).hideCallButton();
}
我想知道我是否可以在不使用以下登录的情况下以某种方式管理它。这样在 controlLayout 在片段中膨胀之前,我可以将属性传递给它,并在构造函数或自定义视图的 init 方法中处理逻辑:
public ControlLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
final TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.ControlLayout,
0, defStyle);
final boolean horizontal = a.getBoolean(R.styleable.ControlLayout_horizontal, false);
final boolean callButtonIsVisible = a.getBoolean(
R.styleable.ControlLayout_callBtnVisibility, true);
a.recycle();
if(callButtonIsVisible) {
mCallButton = new Button(getContext());
mCallButton.setId(R.id.button_call);
...
在onAttach()之前调用的fragment生命周期中的onInflated可以解决这个问题。
我有一个 Fragment,它在布局中包含一个 custom/compound 视图。
<app.view.ControlLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/controlLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_control_size"
android:layout_marginBottom="@dimen/offset_distance"
custom:horizontal="true" />
片段已附加到布局中的不同活动,例如:
<fragment
android:id="@+id/controlLayout"
android:name="app.controllers.ControlFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/fragment_control_size"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/offset_distance"
tools:layout="@layout/fragment_control" />
自定义视图具有以下属性:
<resources>
<declare-styleable name="ControlLayout">
<attr name="horizontal" format="boolean" />
<attr name="callBtnVisibility" format="boolean" />
</declare-styleable>
</resources>
基于 Activity 我的控制片段所附加的,我想将 callBtnVisibility 属性传递给我的自定义视图。一种解决方案是在不使用属性的情况下在代码中处理登录:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_control, container, false);
if (getActivity() instanceof MyActivity) {
((ControlLayout) view.findViewById(R.id.controlLayout)).hideCallButton();
}
我想知道我是否可以在不使用以下登录的情况下以某种方式管理它。这样在 controlLayout 在片段中膨胀之前,我可以将属性传递给它,并在构造函数或自定义视图的 init 方法中处理逻辑:
public ControlLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
final TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.ControlLayout,
0, defStyle);
final boolean horizontal = a.getBoolean(R.styleable.ControlLayout_horizontal, false);
final boolean callButtonIsVisible = a.getBoolean(
R.styleable.ControlLayout_callBtnVisibility, true);
a.recycle();
if(callButtonIsVisible) {
mCallButton = new Button(getContext());
mCallButton.setId(R.id.button_call);
...
在onAttach()之前调用的fragment生命周期中的onInflated可以解决这个问题。