Android类Cast Exception:android.view.ViewGroup $ LayoutParams无法强制转换为android.widget.RelativeLayout $ LayoutParams

时间:2015-04-23 16:28:29

标签: android android-layout debugging

我在调试我正在处理的Android应用程序时遇到了问题。在它的当前点,它应该能够从文本文件(它可以)获取输入,将其转换为包含表示网格部分的Cell对象的ArrayList(它确实),然后使用GridView渲染它们。

当我尝试在模拟器(来自Eclipse)上运行程序时,会出现最新的问题。该程序开始很好,它显示MainMenu罚款。当我点击玩游戏时,它会给我这个错误:

.gitattributes

错误不包含对我的实际程序的任何引用,所以我不太确定错误是什么。我已经包含了一些我认为可能成为问题的文件,但我无法确定(我对此很新)。我在底部包含了一个指向我的完整仓库的链接,但错误是在其他地方。任何帮助将不胜感激,谢谢!

GameScreen.java:

04-23 11:56:30.930: E/AndroidRuntime(948): FATAL EXCEPTION: main
04-23 11:56:30.930: E/AndroidRuntime(948): Process: edu.mbhs.cs.margonon, PID: 948
04-23 11:56:30.930: E/AndroidRuntime(948): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout$DependencyGraph.findRoots(RelativeLayout.java:1722)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout$DependencyGraph.getSortedViews(RelativeLayout.java:1667)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout.sortChildren(RelativeLayout.java:373)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1914)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1293)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer.doCallbacks(Choreographer.java:562)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer.doFrame(Choreographer.java:532)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Handler.handleCallback(Handler.java:733)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Looper.loop(Looper.java:137)
04-23 11:56:30.930: E/AndroidRuntime(948):  at android.app.ActivityThread.main(ActivityThread.java:4998)
04-23 11:56:30.930: E/AndroidRuntime(948):  at java.lang.reflect.Method.invokeNative(Native Method)
04-23 11:56:30.930: E/AndroidRuntime(948):  at java.lang.reflect.Method.invoke(Method.java:515)
04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
04-23 11:56:30.930: E/AndroidRuntime(948):  at dalvik.system.NativeStart.main(Native Method)

gameGridAdapter.java:

package edu.mbhs.cs.margonon;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class GameScreen extends Activity {
    private int[][] gridSolution;
    private int rows;
    private int cols;
    private List<Integer> solList = new ArrayList<Integer>();
    private List<Cell> cellList = new ArrayList<Cell>();
    private List<Boolean> solListBool = new ArrayList<Boolean>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_screen);
        createCellList();
        final GridView gameGrid = (GridView) findViewById(R.id.gameGridView);
        gameGrid.setLayoutParams(new LayoutParams(rows, cols));
        gameGrid.setAdapter(new gameGridAdapter(this, cellList, rows, cols));
        gameGrid.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id){
                cellList.get(position).cycleNext();
                gameGrid.invalidate();
            }
        });
    }

    /**
     * This function takes the data from the raw resource grids.txt and puts it in a 2D array.
     * Currently it can only accept one grid.
     * TODO Make this function work for multiple puzzles (grids) in the file.
     * @return A 2D-array containing the solution for the grid.
     *
    public int[][] readGrids() {
        int[][] gs;
        InputStream is = getResources().openRawResource(R.raw.grids);
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            String[] lineStrings;
            int[] lineInts;

            /* This do-while statement is a work around so that we can define the first two values without 
             * defining lineStrings and lineInts outside of a loop.
             *
             *
            do {
                lineStrings = line.split("\\s");
                lineInts = new int[lineStrings.length];
                //TODO Make sure there are only two numbers.
                for(int i = 0; i < lineStrings.length; i++){
                    try{
                        lineInts[i] = Integer.parseInt(lineStrings[i]);
                    } catch(NumberFormatException e){
                        lineInts[i] = 1;
                    } // end try-catch
                } // end for
                cols = lineInts[0];
                rows = lineInts[1];
            } while(false);
            gs = new int[rows][cols];
            *

            /* This section of code is intended to read each line and plop it into the array.
             *
            line = br.readLine();
            //TODO Add in default values if no grid is found. (And line is therefore null)
            lineStrings = line.split("\\s");
                //lineInts = new int[lineStrings.length];
                for(int i = 0; i < lineStrings.length; i++) {
                    //TODO Handle what happens if the grid is bigger than what was originally specified.
                    try {
                        gs[on][i] = Integer.parseInt(lineStrings[i]);
                        Log.d("PARSING", (on + ", " + i + " = "  + gs[on][i]));
                        if(gs[on][i] == 0)
                            cellList.add(new Cell(on, i, false));
                        else
                            cellList.add(new Cell(on, i, true));
                    } catch(NumberFormatException e) {
                        //TODO Add something to respond to the exception.
                    } // end try-catch
                } // end for
                br.readLine();
                on++;
            } // end while

        } catch (IOException e) {
            gs = new int[1][1];
            gs[0][0] = 1;
            e.printStackTrace();
        } // end try-catch
        return gs;
    } // end public int[][] readGrids
     */ 
    public void createCellList()
    {
        List<Cell> cl;
        InputStream is = getResources().openRawResource(R.raw.grids);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String[] lineStrings;
        int[] lineInts;
        String puzzleText = "";

        try {
            puzzleText = br.readLine();
            lineStrings = puzzleText.split("\\s");
            lineInts = new int[lineStrings.length - 2];
            System.out.println(puzzleText);
            System.out.println(lineStrings.length);

            for(int i = 0; i < lineStrings.length; i++)
            {
                if(i == 0) {
                    cols = Integer.parseInt(lineStrings[i]);
                    continue;
                } else if(i == 1) {
                    rows = Integer.parseInt(lineStrings[i]);
                    continue;
                } else {
                    lineInts[i-2] = Integer.parseInt(lineStrings[i]);
                    System.out.println(i + " " + lineInts[i-2]);
                    solList.add(lineInts[i-2]);
                    if(solList.get(i-2) == 1)
                        solListBool.add(true);
                    else
                        solListBool.add(false);
                }
            }

            gridSolution = new int[rows][cols];

            for(int i = 0; i < lineInts.length; i++)
            {
                int y = i/cols;
                int x = i - y * cols;
                System.out.println("i=" + i + ", x=" + x + ", y=" + y);
                gridSolution[y][x] = lineInts[i];
                cellList.add(new Cell(x, y, solListBool.get(i)));
            }
        } catch (IOException e) {e.printStackTrace();}

    }
}

Cell.java:

package edu.mbhs.cs.margonon;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

/**
 * This is the adapter that draws the grid.
 * 
 * @author Robert Rose
 */
public class gameGridAdapter extends BaseAdapter {
    private LayoutInflater mInflater; // The inflater.
    private List<Cell> cells = new ArrayList<Cell>(); // A list containing all the cell objects.
    private int rows; // The number of rows.
    private int cols; // The number of columns.

    /**
     * This is the constructor which takes the context, a list of cell objects and
     * the grid dimensions to create an adapter which will render the grid.
     * 
     * @param context Context passed in from another class.
     * @param cellsIn 
     * @param r
     * @param c
     */
    public gameGridAdapter(Context context, List<Cell> cellsIn, int r, int c) {
        mInflater = LayoutInflater.from(context);
        for(int i = 0; i < rows; i++)
            for(int k = 0; k < cols; k++)
                cells.add(cellsIn.get(i*(cols - 1) + k));
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return cells.size();
    }

    @Override
    public Object getItem(int position) {
        return cells.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView == null) {
            view = mInflater.inflate(R.layout.button_grid_view, parent, false);
            ImageView imgView = (ImageView) view.findViewById(R.id.imageInGrid);
            imgView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imgView.setPadding(4, 4, 4, 4);
            switch(cells.get(position).getDisplay())
            {
                case 0:
                    imgView.setImageResource(R.drawable.white);
                    break;
                case 1:
                    imgView.setImageResource(R.drawable.colored);
                    break;
                case 2:
                    imgView.setImageResource(R.drawable.cross);
                    break;
                default:
                    Log.d("DRAWING", "display was set to invalid state");
            } // end switch;

        } else {
            view = convertView;
        } // end if


        return view;
    }
    //TODO http://ocddevelopers.com/2014/extend-baseadapter-instead-of-arrayadapter-for-custom-list-items/
    //TODO http://stackoverflow.com/questions/5046320/a-grid-layout-of-icon-text-buttons
}

activity_game_screen.xml:

package edu.mbhs.cs.margonon;

import android.widget.ImageView;

/**
 * This is the cell object for the nonogram program. Each cell has its on cell
 * object that holds what the current status of the cell is.
 * 
 * @author Robert Rose
 */
public class Cell {
    private final boolean willBeFull; // Whether the cell will be full (true) or not (false)
    private int display = 0; // 0 = empty, 1 = filled, 2 = crossed out
    private boolean correctNow; // Whether the cell is currently in its correct state.
    private int rowIndex = -1; // The row on which this cell is located.
    private int columnIndex = -1; // The column on which this cell is located.
    private ImageView iv;

    /**
     * This is the primary constructor that takes a row index and a column index and
     * creates a cell with the value based on a boolean value.
     * 
     * @param ri        Row on which the cell lies.
     * @param ci        Column on which the cell lies.
     * @param willBe    Whether cell will be full or whether it is empty true = 
     *                  full, false = empty.
     */
    public Cell(int ri, int ci, boolean willBe) {
        rowIndex = ri;
        columnIndex = ci;
        willBeFull = willBe;
        display = 0;
        correctNow = isCorrect();
    } // end public Cell(int ri, int ci, boolean willBe)

    /**
     * This is an identical constructor to the one above, but can take an int instead
     * of a boolean value.
     * 
     * @param ri        Row on which the cell lies.
     * @param ci        Column on which the cell lies.
     * @param willBe    Whether cell will be full or whether it is empty. 1 = full 
     *                  (true), 0 = empty (false).
     *                  
     */
    public Cell(int ri, int ci, int willBe) {
        boolean b;
        if(willBe == 1)
            b = true;
        else
            b = false;
        rowIndex = ri;
        columnIndex = ci;
        willBeFull = b;
        display = 0;
        correctNow = isCorrect();
    }

    /**
     * Called to determine whether the current status of the cell is correct.
     * @return T/F. Whether the current status of the cell is correct.
     */
    public boolean isCorrect()
    {
        switch(display)
        {
            case 0:
                if(willBeFull)
                    return false;
                else
                    return true;
            case 1:
                if(willBeFull) 
                    return true;
                else 
                    return false;
            case 2:
                if(willBeFull)
                    return false;
                else
                    return true;
            default:
                return false;
        } // end switch
    } // end public boolean isCorrect()

    public void cycleNext()
    {
        if(display == 2)
            display = 0;
        else
            display++;
    }

    /**
     * Getter function for the willBeFull variable.
     * @return T/F. Whether the cell should be filled or empty
     */
    public boolean getWillBeFull()
    {
        return willBeFull;
    } // end boolean getWillBeFull()

    /**
     * Getter function for the display variable.
     * @return 0 if cell is empty, 1 if cell is full, 2 if cell is crossed out
     */
    public int getDisplay()
    {
        return display;
    } // end public int getDisplay()

    /**
     * Getter function for the correctNow variable. Somewhat obsolete considering
     * the isCorrect() function exists, but I want it here, so I'm going to keep it here.
     * @return T/F. Whether the cell in its current state is correct.
     */
    public boolean getCorrectNow()
    {
        return correctNow;
    } // end public boolean getCorrectNow()

    /**
     * Getter function for the rowIndex, indicating which row the cell resides on the nonogram.
     * @return int. Index of row of the nonogram the cell resides on.
     */
    public int getRowIndex()
    {
        return rowIndex;
    } // end public int getRowIndex()

    /**
     * Getter for the columnIndex, indicating which column the cell resides on the nongram.
     * @return int. Index of coulmn of the nonogram the cell resides on.
     */
    public int getColumnIndex()
    {
        return columnIndex;
    } // end public int getColumnIndex()
}

button_grid_view.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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".GameScreen" >

    <GridView
        android:id="@+id/gameGridView"
        android:layout_width="324dp"
        android:layout_height="324dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:columnWidth="48dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="6"
        android:padding="3dp"
        android:stretchMode="columnWidth"
        android:verticalSpacing="0dp" >
    </GridView>

</RelativeLayout>

完整回复:https://github.com/RobRoseKnows/nonogram

1 个答案:

答案 0 :(得分:1)

在您的代码中,您要导入android.view.ViewGroup.LayoutParams而不是android.widget.RelativeLayout.LayoutParams

尝试从此更改

import android.view.ViewGroup.LayoutParams;

到这个

import android.widget.RelativeLayout.LayoutParams;