繁体   English   中英

调用方法时未将片段添加到活动中

[英]Fragment not added to activity when method is called

我的主要活动是棋盘。 在国际象棋棋盘中,在onCreate中,我设置了一个片段活动GameInfoFragment。 之后,将调用查询SQLite数据库,此后立即调用类SQLiteDataInterpreter中的方法。 从这里开始,调用GameInfoFragment类中的方法,在其中应填充我在Chessboard的onCreate中设置的片段中的imageViews。

当我尝试启动棋盘活动时,出现以下错误:

Caused by: java.lang.IllegalStateException: Fragment GameInfoFragment{2ef389d9 id=0x7f09008d InfoTest} not attached to Activity

Chessboard的onCreate中的代码如下:

FragmentManager manager = this.getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        if (chessboard.moveCounter % 2 == 0) {
            transaction.add(com.zlaporta.chessgame.R.id.game_play_screen, gameInfo, "InfoTest");

        } else {
            transaction.add(com.zlaporta.chessgame.R.id.game_play_black_screen, gameInfo, "InfoTestBlack");
        }
        transaction.commit();

        Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar);
        toolbar.setTitle("Current Game");
        setSupportActionBar(toolbar);


        DBAdapter boardstateDB = new DBAdapter(chessboard.this);
        boardstateDB.open();


        Cursor cur = boardstateDB.getAllRows();

        if (cur != null && cur.moveToFirst()) {
            cur.moveToLast();
            String pieceData = cur.getString(cur.getColumnIndex("piecepositions"));
            whiteKingMoved = cur.getInt(cur.getColumnIndex("whitekingmoved"));
            blackKingMoved = cur.getInt(cur.getColumnIndex("blackkingmoved"));
            leftWRMoved = cur.getInt(cur.getColumnIndex("whiterook1moved"));
            rightWRMoved = cur.getInt(cur.getColumnIndex("whiterook2moved"));
            leftBRMoved = cur.getInt(cur.getColumnIndex("blackrook1moved"));
            rightBRMoved = cur.getInt(cur.getColumnIndex("blackrook2moved"));
            moveCounter = cur.getInt(cur.getColumnIndex("movecount"));
            String madeMoves = cur.getString(cur.getColumnIndex("mademoves"));
            storedTakenPieces = cur.getString(cur.getColumnIndex("takenpieces"));
            SQLiteDataInterpreter boardRefresher = new SQLiteDataInterpreter();
            boardRefresher.refreshBoard(pieceData, madeMoves, chessboard.this, storedTakenPieces);
        } else {
            boardstateDB.updateGameState("r00 k01 b02 q03 a04 b05 k06 r07 p10 p11 p12 p13 p14 p15 p16 p17 P60 P61 P62 P63 P64 P65 P66 P67 R70 K71 B72 Q73 A74 B75 K76 R77",
                    0, 0, 0, 0, 0, 0, 0, " ", " ");
            Cursor curs = boardstateDB.getAllRows();
            curs.moveToLast();

            String pieceData = curs.getString(curs.getColumnIndex("piecepositions"));
            whiteKingMoved = curs.getInt(curs.getColumnIndex("whitekingmoved"));
            blackKingMoved = curs.getInt(curs.getColumnIndex("blackkingmoved"));
            leftWRMoved = curs.getInt(curs.getColumnIndex("whiterook1moved"));
            rightWRMoved = curs.getInt(curs.getColumnIndex("whiterook2moved"));
            leftBRMoved = curs.getInt(curs.getColumnIndex("blackrook1moved"));
            rightBRMoved = curs.getInt(curs.getColumnIndex("blackrook2moved"));
            moveCounter = curs.getInt(curs.getColumnIndex("movecount"));
            String madeMoves = curs.getString(curs.getColumnIndex("mademoves"));
            storedTakenPieces = curs.getString(curs.getColumnIndex("takenpieces"));
            SQLiteDataInterpreter boardRefresher = new SQLiteDataInterpreter();
            boardRefresher.refreshBoard(pieceData, madeMoves, chessboard.this, storedTakenPieces);

和我的GameInfoFragment类中的相关代码导致了问题:

public void setTakenPiece(String[] takenpiecerecord) {
        takenPiece = takenpiecerecord;

        int c;
        for (c = 0; c < takenPiece.length; c++) {
            String takenPieceHolder = "t" + c;
            String pieceCheck = takenPiece[c];
            //System.out.println(square);

                int takenPieceHolderID = this.getResources().getIdentifier(takenPieceHolder, "id", getActivity().getPackageName());
                ImageView takenPieceHolderSquare = (ImageView) v.findViewById(takenPieceHolderID);

引起问题的代码主线是我尝试在正上方的代码中设置takenPieceHolderID的值的地方。

如何确保添加我的片段,以便在棋盘活动开始时填充其imageViews?

您应该检查Activity是否存在,以及isAdded()是否为True

public void setTakenPiece(String[] takenpiecerecord) {
        activity = getActivity();
        if (isAdded() && activity) {
            takenPiece = takenpiecerecord;

            int c;
            for (c = 0; c < takenPiece.length; c++) {
                String takenPieceHolder = "t" + c;
                String pieceCheck = takenPiece[c];
                //System.out.println(square);

                int takenPieceHolderID = this.getResources().getIdentifier(takenPieceHolder, "id", getActivity().getPackageName());
                ImageView takenPieceHolderSquare = (ImageView) v.findViewById(takenPieceHolderID); 
    }}

我使用片段管理器按标签查找片段。 如果返回null,则片段创建有问题。 这取决于我的片段是否具有有效的容器,调用适配器并且适配器不满意,或者它是否不正确地调用视图,因此请仔细检查所有内容。 如果您使用的是容器,请确保将其添加到ViewGroup中,并且该容器已与任何父容器分离。

我以编程方式创建片段,并设置可以搜索的标签名称。

使用调试,请确保调用了片段构造函数,然后确保调用了onCreateView。 如果是这样,请单步执行onCreateView并查找炸弹行。 确保片段返回一个视图。

另外,请确定您使用的片段类型是android还是android.support.v4.app.Fragment。

有时我不得不使用FragmentManager what_your_name_is.executePendingTransactions来确保在访问之前已经添加了片段。 确保使用启动片段的片段管理器。

那是我的头脑转储,祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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