Почему ошибка при изменении параметра?
Изучаю 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 шт):
Несколько иначе делается такая операция.
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);
}