Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.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
Android Studio:以编程方式更改属性不会';设置约束后无法工作_Android_Android Studio_Attributes_Constraints - Fatal编程技术网

Android Studio:以编程方式更改属性不会';设置约束后无法工作

Android Studio:以编程方式更改属性不会';设置约束后无法工作,android,android-studio,attributes,constraints,Android,Android Studio,Attributes,Constraints,我想在图像上的不同特定点上放置一些开关,并支持尽可能多的设备,我创建了一个方法,该方法创建了一个帧矩阵,开关应位于该矩阵上 方法如下: public void initImageOverlayFrames() { //Create frames ImageView imageView = rootView.findViewById(R.id.image_gp); ConstraintSet constraintSet = new Constrain

我想在图像上的不同特定点上放置一些开关,并支持尽可能多的设备,我创建了一个方法,该方法创建了一个帧矩阵,开关应位于该矩阵上

方法如下:

public void initImageOverlayFrames() {
        //Create frames
        ImageView imageView = rootView.findViewById(R.id.image_gp);
        ConstraintSet constraintSet = new ConstraintSet();
        for(int i=0; i<imageOverlayFrames_x.length; i++){
            imageOverlayFrames_x[i] = new FrameLayout(Objects.requireNonNull(getActivity()));
            imageOverlayFrames_x[i].setId(View.generateViewId());
            imageOverlayFrames_x[i].setLayoutParams(new FrameLayout.LayoutParams(imageView.getWidth()/imageOverlayFrames_x.length, imageView.getHeight()/imageOverlayFrames_y.length));
            constraintLayout.addView(imageOverlayFrames_x[i]);
        }
        for(int i=0; i<imageOverlayFrames_y.length; i++){
            imageOverlayFrames_y[i] = new FrameLayout(Objects.requireNonNull(getActivity()));
            imageOverlayFrames_y[i].setId(View.generateViewId());
            imageOverlayFrames_y[i].setLayoutParams(new FrameLayout.LayoutParams(imageView.getWidth()/imageOverlayFrames_x.length, imageView.getHeight()/imageOverlayFrames_y.length));
            constraintLayout.addView(imageOverlayFrames_y[i]);
        }
        //Set the constraints for the Frames
        constraintSet.clone(constraintLayout);
        for(int i=0; i<imageOverlayFrames_x.length; i++){
            if(i==0){
                constraintSet.connect(imageOverlayFrames_x[i].getId(), ConstraintSet.START, imageView.getId(), ConstraintSet.START, 0);
            }
            else {
                constraintSet.connect(imageOverlayFrames_x[i].getId(), ConstraintSet.START, imageOverlayFrames_x[i-1].getId(), ConstraintSet.END, 0);
            }
            constraintSet.connect(imageOverlayFrames_x[i].getId(), ConstraintSet.TOP, imageView.getId(), ConstraintSet.TOP, 0);
        }
        for(int i=0; i<imageOverlayFrames_y.length; i++){
            if(i==0){
                constraintSet.connect(imageOverlayFrames_y[i].getId(), ConstraintSet.TOP, imageView.getId(), ConstraintSet.TOP, 0);
            }
            else {
                constraintSet.connect(imageOverlayFrames_y[i].getId(), ConstraintSet.TOP, imageOverlayFrames_y[i-1].getId(), ConstraintSet.BOTTOM, 0);
            }
            constraintSet.connect(imageOverlayFrames_y[i].getId(), ConstraintSet.START, imageView.getId(), ConstraintSet.START, 0);
        }
        constraintSet.applyTo(constraintLayout);
这非常有效,因此我创建了放置开关的方法:

private void placeSwitches(View view, int[][] positionArray, int[] idArray, final SwitchCompat[] switchCompatArray, int[] rotationArray) {
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);
    for (int i = 0; i < idArray.length; i++) {
        switchCompatArray[i] = view.findViewById(idArray[i]);
        switchCompatArray[i].setRotation(rotationArray[i]);

        if(positionArray[i][0]<imageOverlayFrames_x.length && positionArray[i][1]<imageOverlayFrames_y.length){
            constraintSet.connect(switchCompatArray[i].getId(), ConstraintSet.START, imageOverlayFrames_x[positionArray[i][0]].getId(), ConstraintSet.START); //Todo vor dem setzen überprüfen
            constraintSet.connect(switchCompatArray[i].getId(), ConstraintSet.TOP, imageOverlayFrames_y[positionArray[i][1]].getId(), ConstraintSet.TOP);
        } 
    }
    constraintSet.applyTo(constraintLayout);
}
以及:

这是我的问题: 那
switchCompatArray[i].setRotation(rotationArray[i])什么都不做。开关不转。
但是当我在.xml布局文件中设置旋转时,它工作得非常好,为什么

private void placeSwitches(View view, int[][] positionArray, int[] idArray, final SwitchCompat[] switchCompatArray, int[] rotationArray) {
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);
    for (int i = 0; i < idArray.length; i++) {
        switchCompatArray[i] = view.findViewById(idArray[i]);
        switchCompatArray[i].setRotation(rotationArray[i]);

        if(positionArray[i][0]<imageOverlayFrames_x.length && positionArray[i][1]<imageOverlayFrames_y.length){
            constraintSet.connect(switchCompatArray[i].getId(), ConstraintSet.START, imageOverlayFrames_x[positionArray[i][0]].getId(), ConstraintSet.START); //Todo vor dem setzen überprüfen
            constraintSet.connect(switchCompatArray[i].getId(), ConstraintSet.TOP, imageOverlayFrames_y[positionArray[i][1]].getId(), ConstraintSet.TOP);
        } 
    }
    constraintSet.applyTo(constraintLayout);
}
final int[] switchIdArray = {R.id.switch_1, R.id.switch_2, R.id.switch_3,..., R.id.switch_15, R.id.switch_16};
final SwitchCompat[] switchSwitchCompatArray = new SwitchCompat[switchIdArray.length];    
final int[] switchRotationArray = new int[]{90, 255,..., 90, 90};
final int[][] switchPositionArray = new int[][]{{25, 13}, {4, 9}, {7, 8},..., {0, 0}};