FrameLayout.getLayoutParams 导致应用关闭

FrameLayout.getLayoutParams causing app to close

我正在将图像加载到 ImageViewImageView 包含在 FrameLayout 中。加载图像按预期工作,但现在我想设置 FrameLayout 的边距以匹配加载图像的大小,因为我会将其他视图添加到 FrameLayout 中作为图像的叠加层。

为此,我在实用程序 class 中创建了一个静态方法,它不同于包含 FrameLayoutImageView 的 class。当 运行 utilityclass 中的方法时,它会在下面代码中显示的行中转出应用程序,该行试图获取 FrameLayoutLayoutParams

因为我没有收到错误消息,所以我很难理解哪里出了问题。谁能指出我正确的方向。

处理图像加载的代码作为结果Activity

case REQUEST_OPEN_GALLERY:
    if (resultCode == RESULT_OK && null != data) {
        getSelectedFileFromGallery(data);

         // This block is the new code to apply the layoutParams
          FrameLayout fLayout = (FrameLayout) findViewById(R.id.image_Layout);
          ImageView iView = (ImageView) findViewById(R.id.image_View);
          Utils.addMarginsToImageContainer(fLayout, iView);
          //End of the new block

          toggleViewStatus(ENABLE_OVERLAY_VIEWS); //Enable the text and overlay control
     }
break;

此代码块是被调用并导致 crash\app 关闭的新方法。

public static void addMarginsToImageContainer(FrameLayout fLayout, ImageView iView){
        Integer imageWidth = iView.getWidth();
        Integer imageHeight = iView.getWidth();
        Integer frameWidth = fLayout.getWidth();
        Integer frameHeight = fLayout.getHeight();
        Integer widthDifference = frameWidth - imageWidth;
        Integer heightDifference = frameHeight - imageHeight;
        //Done TO DO: what happens here with no integer returns
        Integer widthMargin =  (int) Math.ceil(widthDifference / 2);
        Integer heightMargin = (int) Math.ceil(heightDifference /2);

        //TODO: The next line crashes the app
        FrameLayout.LayoutParams fLayoutLayoutParams = (FrameLayout.LayoutParams) fLayout.getLayoutParams();
        if (widthMargin > 0 && heightMargin > 0) {
            fLayoutLayoutParams.setMargins(widthMargin,heightMargin,widthMargin,heightMargin);
        }
        else if (widthMargin > 0 && heightMargin <= 0){
            fLayoutLayoutParams.setMargins(widthMargin,0,widthMargin,0);
        }
        else if (widthMargin <= 0 && heightMargin > 0){
            fLayoutLayoutParams.setMargins(0,heightMargin,0,heightMargin);
        }
        else{
            fLayoutLayoutParams.setMargins(0,0,0,0);
        }
        fLayout.setLayoutParams(fLayoutLayoutParams);
    }
}

我不确定是否有人需要任何额外的代码部分,但如果需要请告诉我,我会 post 他们。非常感谢任何帮助。

更新 - 我刚刚意识到 运行 与在手机上调试相反的应用程序引发了错误。错误是

Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://media/external/images/media/3377 flg=0x1 }} to activity myActivity java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

看到这里可能需要注意 framelayout 包含在 RelativeLayout 中。但是,为什么系统将 framelayout 参数转换为 relativelayout 参数我还不明白。

我相当确定之前确实有人问过这个问题,现在我已经看到了实际的错误消息(添加为对原始 post 的编辑)。我通过更改行

解决了这个问题
FrameLayout.LayoutParams fLayoutLayoutParams = (FrameLayout.LayoutParams) fLayout.getLayoutParams();

改为使用 RelativeLayout 参数,例如

    RelativeLayout.LayoutParams fLayoutLayoutParams = (RelativeLayout.LayoutParams) fLayout.getLayoutParams();

至于为什么您需要顶级父视图的布局参数而不是我实际试图影响的视图的布局参数的原因。我认为这是一个已经得到更好回答的问题,但在现阶段我还没有完全理解它。