简体   繁体   中英

ClassCastException: LinearLayout cannot be cast to (java class)

Having an issue with the following error after trying to add a slideout menu to an activity:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to appname.SlideOutMenu

The specific section of code it is finding fault with is this:

public class MainActivity extends Activity implements View.OnClickListener {

SlideOutMenu root;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.root = (SlideOutMenu) this.getLayoutInflater().inflate(R.layout.activity_main, null);
    this.setContentView(root);
}

Here is the relevant section of my xml file:

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:ads="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingLeft="0dp"
 android:paddingRight="0dp"
 android:id="@+id/mainActivityLayout"
 android:paddingTop="0dp"
 android:paddingBottom="0dp"
 tools:context=".MainActivity"
 android:background="#ffffff"
 android:orientation="vertical">

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mainActivitySlideout"
    android:background="#2a80b9"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tempBtn1"
        android:onClick="toggleMenu"
        android:text="Button 1"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="toggleMenu"
        android:id="@+id/tempBtn2"
        android:text="Button 2"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tempBtn3"
        android:onClick="toggleMenu"
        android:text="Button 3"/>
</LinearLayout>

And this is my SlideOutMenu class, if required:

package rule02.touchpool;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class SlideOutMenu extends LinearLayout {
    private View menu;
    private View content;

    protected static final int menuMargin = 150;

    public enum MenuState {
        CLOSED, OPEN
    };

    protected int currentContentOffset = 0;
    protected MenuState menuCurrentState = MenuState.CLOSED;

    public SlideOutMenu(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SlideOutMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SlideOutMenu(Context context) {
        super(context);
    }

    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        this.menu = this.getChildAt(0);
        this.content = this.getChildAt(1);
        this.menu.setVisibility(View.GONE);
    }

    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        if (changed) {
            this.calculateChildDimensions();
        }
        this.menu.layout(left, top, right - menuMargin, bottom);
        this.content.layout(left + this.currentContentOffset, top, right
                + this.currentContentOffset, bottom);
    }

    public void toggleMenu() {
        switch (this.menuCurrentState) {
        case CLOSED:
            this.menu.setVisibility(View.VISIBLE);
            this.currentContentOffset = this.getMenuWidth();
            this.content.offsetLeftAndRight(currentContentOffset);
            this.menuCurrentState = MenuState.OPEN;
            break;
        case OPEN:
            this.content.offsetLeftAndRight(-currentContentOffset);
            this.currentContentOffset = 0;
            this.menuCurrentState = MenuState.CLOSED;
            this.menu.setVisibility(View.GONE);
            break;
        }
        this.invalidate();
    }

    private int getMenuWidth() {
        return this.menu.getLayoutParams().width;
    }

    private void calculateChildDimensions() {
        this.content.getLayoutParams().height = this.getHeight();
        this.content.getLayoutParams().width = this.getWidth();
        this.menu.getLayoutParams().width = this.getWidth() - menuMargin;
        this.menu.getLayoutParams().height = this.getHeight();
    }
}

If anyone can help then I will be so very happy!! :)

Edit:

Is it something to do with declaring SlideOutMenu as the root view in the xml document? If so, I am not exactly sure how to do this and cannot find any info on it.

indirect connected post & its indirect explanation , now follows the following code

SlideOutMenu root;
View container;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
container = getLayoutInflater().inflate(R.layout.activity_main, null);
root = (SlideOutMenu) container.findViewById(R.id.mainActivitySlideout);
 this.setContentView(container);
//the following codes can follow

your xml

//the important part
<rule02.touchpool.SlideOutMenu 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainActivitySlideout"
android:background="#2a80b9"
android:orientation="vertical">

the rest is ok, remember to close it with </rule02.touchpool.SlideOutMenu>

I think root is your layout xml file. Therefore code should be, for fixing compile error:

this.root = (LinearLayout) this.getLayoutInflater().inflate(R.layout.activity_main, null);

Standard suggested code is:

setContentView(R.layout.activity_main);

Note: I prefer the standard code.

You can either use an XML or a class to create UI. How are you using both and trying to convert one to another? It will never work. Either instantiate you layout java class and set it in content view or inflate your xml and set it.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(this.getLayoutInflater().inflate(R.layout.activity_main, null));
}

or you can do

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout som = new SlideOutMenu(this);
    this.setContentView(som );
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM