2017-06-23 19 views
-3

所以我正在制作一个应用程序,用一个片段上的按钮输入信息,然后将信息发送回活动,并用另一个片段替换片段,以显示检索到的信息从第一个片段。但是,我收到一个错误:“com.example.cribbage2.CardKeyboardFrag不能转换为com.example.cribbage2.PCResultsFrag”,我不知道为什么。“无法投射到”带有碎片的例外

这是该活动的相关代码:

package com.example.cribbage2; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 
import android.os.Bundle; 

import java.util.Arrays; 

public class PointCalculator extends FragmentActivity implements CardKeyboardFrag.InfoTransfer { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_point_calculator); 

    //set cardKeyboardFrag 
    CardKeyboardFrag cardFrag = new CardKeyboardFrag(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.add(R.id.fragment_container, cardFrag); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

    //tell fragment how many cards you are requesting 
} 

public void cardNumSet(int cardNumMin, int cardNumMax){ 
    CardKeyboardFrag cardKeyboardFrag = (CardKeyboardFrag) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
    cardKeyboardFrag.cardNumGet(cardNumMin, cardNumMax); 
} 

public void displayResults(int[] resultsIntArray){ 

    //parse intArray into String 
    String[] resultsStringArray = new String[4]; 
    int loop = 0; 
    for (int num: resultsIntArray){ 
     resultsStringArray[loop] = Integer.toString(num); 
     loop++; 
    } 

    //transfer to new fragment 
    PCResultsFrag resultsFrag = new PCResultsFrag(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment_container, resultsFrag); 
    transaction.addToBackStack(null); 
    transaction.commit(); 


    //this is the line where the error occurs 
    PCResultsFrag pcResultsFrag = (PCResultsFrag) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 

    pcResultsFrag.getResultsArray(resultsStringArray); 
} 
+0

好了,' R.id.fragment_container'返回给你一个'CardKeyboardFrag',就像你已经做过的那样(CardKeyboardFrag)getSupportFragmentManager()。findFragmentById(R.id.fragment_container);'。但是在这里你试图把它转换成一个不兼容的'PCResultsFrag'。 – QBrute

+0

那么解决方案是什么?如何将PCResultsFrag放入容器?或从容器中删除CardKeyboardFrag? –

+0

@QBrute ^^^^^^^^^ –

回答

-1

你在findFragmentById引用资源ID是分片容器视图,而不是碎片问题。

PCResultsFrag pcResultsFrag = (PCResultsFrag) getSupportFragmentManager().findFragmentById(**R.id.fragment_container**); 

CardKeyboardFrag cardKeyboardFrag = (CardKeyboardFrag) getSupportFragmentManager().findFragmentById(**R.id.fragment_container**); 
+0

是的,这不是我应该做的吗? –

+0

你有清单中声明的​​每个碎片的实例吗?如果是这样,请使用在那里声明的is属性。如果创建的是浅度,那么您将需要一种不同的方式从片段管理器中检索片段 – airowe

0

尽量使交易是这样的:

transaction.replace(R.id.fragment_container, resultsFrag , "resultsFrag"); 

,然后得到这样的片段的对象:

Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("resultsFrag"); 

currentFragment.getResultsArray(resultsStringArray); 
+0

但是我不能使用'.getResultsArray',因为'currentFragment'是片段的对象而不是'PCResultsFrag' –

+0

每当我尝试你所说的,'.getResultsArray'变成红色 –

+0

嗯,我改变了它,它的工作原理,但现在它说对象引用为空 –