在基于 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可以解决这个问题。