Подтвердить что ты не робот

LinearLayout $LayoutParams нельзя отбрасывать в android.widget.FrameLayout $LayoutParams

Объяснение и решение внизу.

Я являюсь разработчиком одной анимации макета слайдера, работа анимации прекрасна, но когда весь конец процесса получает следующее Исключение.

Я думаю, что RelativeLayout родительский имеет что-то делать в исключении, но я не знаю, разрешил его.

09-06 11:24:58.952: E/Trace(30884): error opening trace file: No such file or directory (2)
09-06 11:25:09.113: E/AndroidRuntime(30884): FATAL EXCEPTION: main
09-06 11:25:09.113: E/AndroidRuntime(30884): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:311)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2161)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2129)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1240)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1433)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1125)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4607)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:747)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer.doCallbacks(Choreographer.java:567)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer.doFrame(Choreographer.java:536)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:733)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Handler.handleCallback(Handler.java:615)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Looper.loop(Looper.java:153)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.app.ActivityThread.main(ActivityThread.java:5086)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at java.lang.reflect.Method.invokeNative(Native Method)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at java.lang.reflect.Method.invoke(Method.java:511)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
09-06 11:25:09.113: E/AndroidRuntime(30884):    at dalvik.system.NativeStart.main(Native Method)

activity_home.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/leftView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#cad000"
        android:orientation="vertical" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/mainView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#876000"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#cecece"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/btnSlide"
                style="@style/btn1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="X" />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

Деятельность

public class HomeActivity extends Activity implements OnClickListener {

    UserStorage userStorage = new UserStorage();

    private Button btnSlide;
    private LinearLayout mainView, leftView;
    private SliderAnimation slideAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        this.leftView = (LinearLayout) findViewById(R.id.leftView);
        this.mainView = (LinearLayout) findViewById(R.id.mainView);

        this.btnSlide = (Button) findViewById(R.id.btnSlide);
        this.btnSlide.setOnClickListener(this);

        this.slideAnimation = new SliderAnimation(this);

        this.slideAnimation.initializeFilterAnimations(this.mainView, this.leftView);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

        case R.id.btnSlide:

            this.slideAnimation.toggleLeftSliding();

            break;
        }
    }
}

AnimationListener

public class SliderAnimation implements AnimationListener {

    private Context context;

    private LinearLayout mainView, leftView;

    private Animation mainSlideIn, mainSlideOut;

    private boolean leftAnimated, rightAnimated = false;

    private int deviceWidth;

    public SliderAnimation(Context context) {

        this.context = context;

        DisplayMetrics displayMetrics = context.getResources()
                .getDisplayMetrics();

        this.deviceWidth = displayMetrics.widthPixels;
    }

    public void initializeFilterAnimations(LinearLayout mainView,
            LinearLayout leftView) {

        this.mainView = mainView;
        this.leftView = leftView;

        this.mainSlideIn = AnimationUtils.loadAnimation(context,
                R.anim.main_slide_in);
        this.mainSlideIn.setAnimationListener(this);

        this.mainSlideOut = AnimationUtils.loadAnimation(context,
                R.anim.main_slide_out);
        this.mainSlideOut.setAnimationListener(this);
    }

    public void toggleLeftSliding() {

        if (!this.leftAnimated) {

            this.mainView.startAnimation(this.mainSlideIn);
        } else {

            this.mainView.startAnimation(this.mainSlideOut);
        }
    }

    @Override
    public void onAnimationEnd(Animation animation) {

        if (!this.leftAnimated) {

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    (this.deviceWidth * 20) / 100, this.mainView.getHeight());

            params.leftMargin = (this.deviceWidth * 80) / 100;

            this.mainView.setLayoutParams(params);

            this.leftAnimated = true;
        } else {

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    this.deviceWidth, this.mainView.getHeight());

            params.leftMargin = 0;

            this.mainView.setLayoutParams(params);

            this.leftAnimated = false;
        }
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }

    @Override
    public void onAnimationStart(Animation animation) {
    }
}

Спасибо заранее.

ОБЪЯСНЕНИЕ И РЕШЕНИЕ

Мы должны знать родительский контейнер ViewGroup для представления, потому что представления заполняются родительскими макетами LayoutParams для целей измерения.

Если мы не знаем, просто взглянув на xml, который является родительской ViewGroup для представления, мы всегда можем ссылаться на метод .getParent() из экземпляра View.

4b9b3361

Ответ 1

У меня возникла аналогичная проблема, и я нашел ответ здесь. В принципе, вы должны выбрать LayoutParams в зависимости от родителя, в вашем случае new LinearLayout.LayoutParams должен быть new RelativeLayout.LayoutParams.

Ответ 2

Попробуйте

  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(this.mainview.getWidth(),       this.mainview.getHeight());
    params.setMargins(left, top, right, bottom);
    this.mainview.setLayoutParams(params);

Это может помочь вам

Ответ 3

Вы не должны создавать объект LayoutParmas макета, размер которого вы хотите установить из java. Скорее вы должны создать объект LayoutParams родительского макета. Например, в макете ниже, чтобы установить параметры макета LinearLayout, вы должны сделать LayoutParmas RelativeLayout не самой LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".newsblog.NewsDetailsActivity"
>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>


 </RelativeLayout>


//IN ACTIVITY
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(30,30); //Parent Params
linearLayout.setLayoutParmas(params); //Child Layout


//If you want to set the params of the Relative Layout. It seems it doesn't have any parent but it has a parent created by android framework which is a frame layout. So 
FrameLayout.LayoutParmas params=new FrameLayout.LayoutParmas(30, 30);//FrameLayout is a parentcreated by anroid frame work
relativeLayout.setLayoutParmas(params);  ////Here Relative layout is child

Ответ 4

Попробуйте сделать свой проект. У вас должна быть копия, вставленная блоком xml из FrameLayout и измененным тегом. Это неприятная ошибка в Android.

Аналогичная проблема возникла и в другом обсуждении. Надеюсь, это одна и та же причина.

Ответ 5

Выше ошибка из-за прохождения неправильных параметров кастинга: - потому что некоторое время вы устанавливаете параметр programattically для линейного макета, но когда вы делаете getLayoutParams(), тогда он некоторое время дает родительскую макетную ссылку, а затем дает выше ошибки.

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) parentLayout.getLayoutParams();
        int leftMargin = (int) getResources().getDimension(R.dimen.exclusion_card_margin_left_right);
        int rightMargin = (int) getResources().getDimension(R.dimen.exclusion_card_margin_left_right);

        params.setMargins(leftMargin, 0, rightMargin, 0);
        parentLayout.setLayoutParams(params);