Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我在自定义视图中做错了什么,导致它不能在我的可扩展列表视图中渲染(其他视图渲染良好)-Android_Java_Android_Xml_Expandablelistview_Android Custom View - Fatal编程技术网

Java 我在自定义视图中做错了什么,导致它不能在我的可扩展列表视图中渲染(其他视图渲染良好)-Android

Java 我在自定义视图中做错了什么,导致它不能在我的可扩展列表视图中渲染(其他视图渲染良好)-Android,java,android,xml,expandablelistview,android-custom-view,Java,Android,Xml,Expandablelistview,Android Custom View,我正在尝试在Android中创建一个可扩展的listview,它使用一个自定义UI组件作为子视图,但在实际渲染时遇到了问题。当使用调试器跟踪我的应用程序时,我看到我的自定义UI对象被实例化并设置了数据,但它似乎没有添加到视图中,即使我在getChildView()的末尾返回视图 我的最终目标是创建一个自定义UI元素,ServiceSelectionCheckbox,我可以直接从布局托盘拖放它 我尝试直接膨胀这个组件的XML,以查看是否是我的XML出现了导致无声故障的问题,但它似乎膨胀得很好。我还

我正在尝试在Android中创建一个可扩展的listview,它使用一个自定义UI组件作为子视图,但在实际渲染时遇到了问题。当使用调试器跟踪我的应用程序时,我看到我的自定义UI对象被实例化并设置了数据,但它似乎没有添加到视图中,即使我在
getChildView()
的末尾返回视图

我的最终目标是创建一个自定义UI元素,
ServiceSelectionCheckbox
,我可以直接从布局托盘拖放它

我尝试直接膨胀这个组件的XML,以查看是否是我的XML出现了导致无声故障的问题,但它似乎膨胀得很好。我还尝试过创建一个具有坚实背景的二级更简单的UI组件,以查看是否可以正确添加该组件。这让我觉得我的问题在于我的自定义UI组件,
ServiceSelectionCheckbox.java
,但我似乎不知道这个问题是什么。我的linter不会抛出错误,我的apk编译得很好

如果能为我指明正确的方向,我将不胜感激

MainActivity.java

public class MainActivity extends AppCompatActivity {


    public HashMap<String, ArrayList<Pair<String, String>>> hashMapOfServices = new HashMap<>();
    public ArrayList<Pair<String, String>> aList;
    public ExpandableListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        aList = new ArrayList<Pair<String, String>>();
        aList.add(new Pair<>("Men's Haircut", "50.00"));
        hashMapOfServices.put("Haircut", aList);
        list = (ExpandableListView) this.findViewById(R.id.list);
        list.setAdapter((ExpandableListAdapter) new ServiceExpandableListAdapter(this, this.hashMapOfServices));


    }
}
public class ServiceExpandableListAdapter extends BaseExpandableListAdapter {
    HashMap<String, ArrayList<Pair<String, String>>> hashmap;
    Context mContext;
    String[] selectedCategories;

    TextView price;
    ImageButton increment, decrement;
    ConstraintLayout lowerLayout;
    public static final ArrayList<String> POSSIBLECATEGORIES = new ArrayList<>(Collections.unmodifiableList(
            Arrays.asList("Barber", "Braids", "Children", "Color", "Esthetician",
                    "Eyebrows", "Eyelashes", "Hair Extensions", "Haircut", "Make-Up",
                    "Massage", "Nails", "Natural Hair", "Straightening", "Style", "Tanning", "Twists", "Waxing", "Weaves")));

    public ServiceExpandableListAdapter(Context context, HashMap<String, ArrayList<Pair<String, String>>> data) {
        mContext = context;
        hashmap = data;
        selectedCategories = data.keySet().toArray(new String[data.size()]);

    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater infalater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalater.inflate(R.layout.group_heading, null);
        }
        TextView categoryName = (TextView) convertView.findViewById(R.id.service_category_tv);
        ImageView groupHolder = (ImageView) convertView.findViewById(R.id.groupholder);
        categoryName.setText(selectedCategories[groupPosition]);
        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_row, parent, false);
            //This one works properly
//            convertView = inflater.inflate(R.layout.view, parent, false);
        }

        //return convertView;

        String category = selectedCategories[groupPosition];
        ServiceSelectionCheckbox checkbox = convertView.findViewById(R.id.service_selection_checkbox);

        String service = hashmap.get(category).get(childPosition).first;
        checkbox.setText(service);
//        Pair of format <ServiceName, Price>
        Pair<String, String> testPair = new Pair<>(hashmap.get(selectedCategories[groupPosition]).get(childPosition).first, hashmap.get(selectedCategories[groupPosition]).get(childPosition).second);
        if (hashmap.containsValue(testPair)) {
            checkbox.setChecked(true);
        } else {

            checkbox.setChecked(false);
        }

        return convertView;
    }


    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {

        return childPosition;
    }

    @Override
    public long getGroupId(int groupPosition) {

        return groupPosition;
    }

    @Override
    public int getGroupCount() {

        return this.hashmap.keySet().size();
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return hashmap.get(selectedCategories[groupPosition]).get(childPosition);
    }

    @Override
    public Object getGroup(int groupPosition) {
        return hashmap.get(selectedCategories[groupPosition]);

    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return hashmap.get(selectedCategories[groupPosition]).size();

    }

}
public class ServiceSelectionCheckbox extends View implements View.OnClickListener {

    private ConstraintLayout lowerLayout;
    private ImageButton increment, decrement;
    private float price;
    private int quantity;
    private TextView priceView, quantityView;
    private CheckBox checkBox;
    private boolean isQuantitySelectionVisible;

    public ServiceSelectionCheckbox(Context context, AttributeSet attrs, String serviceName, String price, int quantity) {
        super(context, attrs);
        this.isQuantitySelectionVisible = true;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.service_selection_checkbox_layout, null);
        priceView = (TextView) v.findViewById(R.id.service_selection_priceview);
        checkBox = (CheckBox) v.findViewById(R.id.ssc_checkbox);
        lowerLayout = (ConstraintLayout) v.findViewById(R.id.ssc_constraint_layout_quantity);
        quantityView = (TextView) v.findViewById(R.id.ssc_service_quantity_countview);
        increment = (ImageButton) v.findViewById(R.id.ssc_increase_service_count);
        decrement = (ImageButton) v.findViewById(R.id.ssc_decrease_service_count);

    }

    public ServiceSelectionCheckbox(Context context) {
        super(context);
        this.init();
    }

    public ServiceSelectionCheckbox(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.init();
    }

    private void init() {

        this.isQuantitySelectionVisible = false;
        LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.service_selection_checkbox_layout, null);
        priceView = (TextView) v.findViewById(R.id.service_selection_priceview);
        checkBox = (CheckBox) v.findViewById(R.id.ssc_checkbox);
        this.setOnClickListener(this);
        lowerLayout = (ConstraintLayout) v.findViewById(R.id.ssc_constraint_layout_quantity);
        quantityView = (TextView) v.findViewById(R.id.ssc_service_quantity_countview);
        increment = (ImageButton) v.findViewById(R.id.ssc_increase_service_count);
        decrement = (ImageButton) v.findViewById(R.id.ssc_decrease_service_count);
    }

    public ServiceSelectionCheckbox(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.init();
    }


    @Override
    public void onClick(View view) {
        isQuantitySelectionVisible = !isQuantitySelectionVisible;
    }

    @Override
    public boolean performClick() {
        //set lowerlayout as visible based on visible variable
        if (this.isQuantitySelectionVisible) {
            lowerLayout.setVisibility(View.VISIBLE);
        } else {
            lowerLayout.setVisibility(View.GONE);
        }

        return super.performClick();
    }


    public void setPrice(float price) {
        this.price = price;
        this.priceView.setText(String.valueOf(price));
    }

    public void setQuantity(String quantity) {
        this.quantity = Integer.parseInt(quantity);

    }

    public void setChecked(boolean b) {
        this.checkBox.setChecked(b);
    }

    public void setText(String serviceName) {
        this.checkBox.setText(serviceName);

    }


}
下面是相应的XML文件

group_heading.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/service_category_tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_weight="3"
        android:fontFamily="sans-serif-light"
        android:text="Categoy"
        android:textSize="22sp"
        android:background="@android:color/holo_orange_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/groupholder"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <ImageView
        android:id="@+id/groupholder"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="end"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:foregroundGravity="right"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/service_category_tv"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteY="81dp">


    <com.example.gabriel.uitest.ServiceSelectionCheckbox
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/service_selection_checkbox"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:layout_editor_absoluteY="81dp">


    <CheckBox
        android:id="@+id/ssc_checkbox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:checked="false"
        android:fontFamily="sans-serif-light"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:text="Service"
        android:textAllCaps="true"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@+id/ssc_constraint_layout_quantity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/service_selection_priceview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:fontFamily="sans-serif-light"
        android:gravity="start|center"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        android:layout_marginRight="8dp" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/ssc_constraint_layout_quantity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ssc_checkbox">

        <ImageButton
            android:id="@+id/ssc_decrease_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ssc_service_quantity_countview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:fontFamily="sans-serif-light"
            android:gravity="center"
            android:paddingEnd="8dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:paddingStart="8dp"
            android:text="Quantity"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_increase_service_count"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_decrease_service_count"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/ssc_increase_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<View
    android:background="@color/colorAccent"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
    </View>

这就是我认为实际上给我带来问题的文件

child_row.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/service_category_tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_weight="3"
        android:fontFamily="sans-serif-light"
        android:text="Categoy"
        android:textSize="22sp"
        android:background="@android:color/holo_orange_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/groupholder"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <ImageView
        android:id="@+id/groupholder"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="end"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:foregroundGravity="right"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/service_category_tv"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteY="81dp">


    <com.example.gabriel.uitest.ServiceSelectionCheckbox
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/service_selection_checkbox"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:layout_editor_absoluteY="81dp">


    <CheckBox
        android:id="@+id/ssc_checkbox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:checked="false"
        android:fontFamily="sans-serif-light"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:text="Service"
        android:textAllCaps="true"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@+id/ssc_constraint_layout_quantity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/service_selection_priceview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:fontFamily="sans-serif-light"
        android:gravity="start|center"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        android:layout_marginRight="8dp" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/ssc_constraint_layout_quantity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ssc_checkbox">

        <ImageButton
            android:id="@+id/ssc_decrease_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ssc_service_quantity_countview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:fontFamily="sans-serif-light"
            android:gravity="center"
            android:paddingEnd="8dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:paddingStart="8dp"
            android:text="Quantity"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_increase_service_count"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_decrease_service_count"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/ssc_increase_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<View
    android:background="@color/colorAccent"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
    </View>

单独渲染时,将按预期创建视图。 服务\u选择\u复选框\u布局.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/service_category_tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_weight="3"
        android:fontFamily="sans-serif-light"
        android:text="Categoy"
        android:textSize="22sp"
        android:background="@android:color/holo_orange_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/groupholder"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <ImageView
        android:id="@+id/groupholder"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="end"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:foregroundGravity="right"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/service_category_tv"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteY="81dp">


    <com.example.gabriel.uitest.ServiceSelectionCheckbox
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/service_selection_checkbox"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:layout_editor_absoluteY="81dp">


    <CheckBox
        android:id="@+id/ssc_checkbox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:checked="false"
        android:fontFamily="sans-serif-light"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:text="Service"
        android:textAllCaps="true"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@+id/ssc_constraint_layout_quantity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/service_selection_priceview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:fontFamily="sans-serif-light"
        android:gravity="start|center"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        android:layout_marginRight="8dp" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/ssc_constraint_layout_quantity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ssc_checkbox">

        <ImageButton
            android:id="@+id/ssc_decrease_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ssc_service_quantity_countview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:fontFamily="sans-serif-light"
            android:gravity="center"
            android:paddingEnd="8dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:paddingStart="8dp"
            android:text="Quantity"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_increase_service_count"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_decrease_service_count"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/ssc_increase_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<View
    android:background="@color/colorAccent"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
    </View>

这是我为前面提到的测试目的而添加的测试视图组件,这个很好用。 view.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/service_category_tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_weight="3"
        android:fontFamily="sans-serif-light"
        android:text="Categoy"
        android:textSize="22sp"
        android:background="@android:color/holo_orange_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/groupholder"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <ImageView
        android:id="@+id/groupholder"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="end"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:foregroundGravity="right"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/service_category_tv"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteY="81dp">


    <com.example.gabriel.uitest.ServiceSelectionCheckbox
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/service_selection_checkbox"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    tools:layout_editor_absoluteY="81dp">


    <CheckBox
        android:id="@+id/ssc_checkbox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:checked="false"
        android:fontFamily="sans-serif-light"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:text="Service"
        android:textAllCaps="true"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@+id/ssc_constraint_layout_quantity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/service_selection_priceview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:fontFamily="sans-serif-light"
        android:gravity="start|center"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        android:layout_marginRight="8dp" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/ssc_constraint_layout_quantity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ssc_checkbox">

        <ImageButton
            android:id="@+id/ssc_decrease_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/ssc_service_quantity_countview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:fontFamily="sans-serif-light"
            android:gravity="center"
            android:paddingEnd="8dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:paddingStart="8dp"
            android:text="Quantity"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/ssc_increase_service_count"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_decrease_service_count"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/ssc_increase_service_count"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/ssc_service_quantity_countview"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<View
    android:background="@color/colorAccent"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
    </View>

您需要定义如下所述的自定义视图。将其他代码添加到此视图中。我很简单,这样你就更容易理解了

public class CustomView extends ConstraintLayout {
        public CustomView(Context context) {
            super(context);
            init();
        }

        public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }

        public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }

        void init() {
            inflate(getContext(), R.layout. service_selection_checkbox_layout, this);
        }
    }

除非需要,否则不要嵌套约束布局。在上面用一个constraintlayout本身给出的xml中,您可以创建相同的UI。

创建自定义视图的方式不正确。看到xml后,我假设您正在尝试创建复合视图。。自定义视图应扩展约束布局并直接调用充气。。我假设布局在默认情况下将使用充气方法