Почему ошибка при изменении параметра?

Изучаю Android Java. Использую Android Studio.
Пробую программно менять параметры LinearLayout (корневой в макете)

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/containerMy"
    android:background="@android:color/holo_blue_dark"
    android:layout_width="match_parent"  
    android:layout_height="50dp"  
    android:orientation="vertical">  
</LinearLayout>  

Для этого в написал такой код:

import android.os.Bundle;  
import android.widget.LinearLayout;  
import androidx.appcompat.app.AppCompatActivity;  
 
public class MainActivity extends AppCompatActivity{  
    private LinearLayout linearLayout;  
    private LinearLayout.LayoutParams lParams;  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  
        linearLayout =  findViewById(R.id.containerMy);  
        lParams = (LinearLayout.LayoutParams) linearLayout.getLayoutParams();  
        lParams.height = 700;  
    }  
} 

Т.е. я хочу чтобы высота корневого LinearLayout изменилась и стала равна 700dp.
Но в строке

lParams.height = 700;

появляется ошибка
"java.lang.RuntimeException: Unable to start activity ComponentInfo{deitel.com/deitel.com.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams"
Т.е. программа не может сделать кастинг из FrameLayout в LinearLayout.
Но у меня нет никакого FrameLayout!
Зато если я исправляю макет и заменяю LinearLayout на FrameLayout (и в коде заменяю всё на FrameLayout), то всё работает

Подскажите, что я делаю не так и как это исправить?


Ответы (1 шт):

Автор решения: AVRamones

Несколько иначе делается такая операция.

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
               FrameLayout.LayoutParams.MATCH_PARENT,
               pxToDp(700));

затем :

linearLayout.setLayoutParams(params);

А таким образом вы можете осуществлять конвертирование для вашего LinearLayout.LayoutParams :

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

       
→ Ссылка