LinearLayout$LayoutParams kann nicht in android.widget.FrameLayout$LayoutParams umgewandelt werden

Lesezeit: 7 Minuten

Benutzer-Avatar
Daniel

Erklärung und Lösung unten.

Ich entwickle eine Slider-Layout-Animation, die Animation funktioniert gut, aber wenn alle Prozesse enden, erhalten sie die nächste Ausnahme.

ich vermute RelativeLayout Eltern haben ausnahmsweise etwas zu tun, aber ich weiß nicht, wie ich es lösen soll.

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>

Aktivität

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) {
    }
}

Danke im Voraus.

ERKLÄRUNG UND LÖSUNG

Wir müssen den übergeordneten ViewGroup-Container für die Ansicht kennen, da Ansichten zu Messzwecken mit ihren übergeordneten LayoutParams gefüllt werden.

Wenn wir nicht durch einen einfachen Blick auf die XML-Datei wissen, welche die übergeordnete ViewGroup für die View ist, können wir ihre Referenz immer mit der Methode .getParent() aus der View-Instanz abrufen.

  • Ist dies die richtige Antwort ?

    – Yosidroid

    31. Mai 2017 um 1:41 Uhr

Benutzer-Avatar
ForceMagic

Ich bin auf ein ähnliches Problem gestoßen und habe hier die Antwort gefunden. Grundsätzlich sollten Sie in Ihrem Fall die LayoutParams abhängig vom Parent wählen new LinearLayout.LayoutParams sollte sein new RelativeLayout.LayoutParams.

  • Gut zu wissen, Sie haben mein Problem gelöst. Ich habe versucht, die Einschränkung für das Kind anstelle des Elternteils hinzuzufügen. Jetzt funktioniert es wie am Schnürchen.

    – tryp

    18. März 2016 um 9:31 Uhr

  • Ohhh… die ELTERN. Macht Sinn. Legte es basierend auf seinem eigenen Typ fest, der eine ViewGroup einer anderen Art war (dh: LinearLayout, wobei das übergeordnete Element FrameLayout war). Subtil!

    – März

    10. Mai 2017 um 14:24 Uhr

Benutzer-Avatar
Balman Rawat

Das sollte man nicht machen LayoutParmas Objekt des Layouts, dessen Dimension Sie aus Java festlegen möchten. Vielmehr sollte man das machen LayoutParams Objekt des übergeordneten Layouts. Zum Beispiel im Layout unten, um die Layout-Parameter der festzulegen LinearLayout das musst du machen LayoutParmas von RelativeLayout nicht LinearLayout selbst:

<?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 der Aktivitätsklasse:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30,30); // parent params
linearLayout.setLayoutParmas(params); // child layout

Wenn Sie die Parameter der RelativeLayoutes scheint, dass es kein übergeordnetes Element hat, aber es hat ein übergeordnetes Element, das vom Android-Framework erstellt wurde, bei dem es sich um ein Frame-Layout handelt:

FrameLayout.LayoutParmas params = new FrameLayout.LayoutParmas(30, 30); // FrameLayout is a parent-created by android framework
relativeLayout.setLayoutParmas(params); // relative layout is child here

  • Dies ist die richtige Antwort. Ich habe RelativeLayout.LayoutParams in FrameLayout.LayoutParams geändert, dann war das Problem gelöst.

    – Mohammad Afrashteh

    8. Oktober 2018 um 0:30 Uhr

Versuchen Sie, Ihr Projekt zu bereinigen. Sie müssen einen XML-Block aus einem FrameLayout kopiert und eingefügt und das Tag geändert haben. Dies ist ein böser Fehler in Android.

Bei einer anderen Diskussion gab es ein ähnliches Problem. Ich hoffe, das ist die gleiche Ursache.

  • Was muss ich genau machen?, 1º Welches Codebit schneiden?. 2º sauberes Projekt und nach dem Einfügen des ausgeschnittenen Codebits erneut?

    – Dani

    6. September 2013 um 19:29 Uhr

  • In Ihrem Eclipse-Menü: Projekt -> Bereinigen … Führen Sie einfach Ihre App erneut aus. Dieser Fehler sollte verschwinden.

    – Tschad

    6. September 2013 um 19:39 Uhr

  • Hallo nochmal @Chad, deine Lösung funktioniert nicht, derselbe Fehler bleibt bestehen … 🙁

    – Dani

    8. September 2013 um 17:29 Uhr

  • Sir, ich habe versucht, Ihre App basierend auf Ihrem Code neu zu erstellen, aber initializeFilterAnimations() auskommentiert, weil Sie die Codes dafür nicht angegeben haben und Ihre App einwandfrei funktioniert hat. Ich denke also, Sie haben Ihre Anwendung nie neu erstellt, wie ich sagte.

    – Tschad

    8. September 2013 um 18:19 Uhr

Benutzer-Avatar
Swati Srivastav

Versuche dies:

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

Dies kann eine Hilfe sein.

Obiger Fehler aufgrund falscher Casting-Parameter: – Weil Sie einige Zeit programmatisch Parameter für das lineare Layout festlegen, aber wenn Sie getLayoutParams() ausführen, gibt es einige Zeit eine Referenz auf das übergeordnete Layout, dann gibt es den obigen Fehler.

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);

1216480cookie-checkLinearLayout$LayoutParams kann nicht in android.widget.FrameLayout$LayoutParams umgewandelt werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy