两个片段之间进行通信时的java.lang.ClassCastException

时间:2014-09-02 05:58:06

标签: android android-fragments

我有两个Fragments,一个Activity和一个Interface

FragmentA包含一个ButtonFragmentB包含一个TextViewMainActivity实现Interface,用于片段通信。

这是mainActivity layout文件,我有一个很大的悲剧。

activity_main.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=".MainActivity" 
        android:id="@+id/main">
           <fragment
            android:id="@+id/fragment1"
            android:name="com.example.fragment3.FragmentA"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/fragment2"
            android:layout_alignParentTop="true"
            android:layout_marginTop="157dp" />


            <fragment
            android:id="@+id/fragment2"
            android:name="com.example.fragment3.FragmentB"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/fragment1"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="40dp" />

            </RelativeLayout>   

当我点击按钮时,所有内容都能正常运行,代码按预期运行但是当我在相同布局中交换上面的两个片段然后点击按钮时会出现以下错误

09-02 11:03:54.569: E/AndroidRuntime(1750): FATAL EXCEPTION: main
09-02 11:03:54.569: E/AndroidRuntime(1750): java.lang.ClassCastException: com.example.fragment3.FragmentA cannot be cast to com.example.fragment3.FragmentB
09-02 11:03:54.569: E/AndroidRuntime(1750):     at com.example.fragment3.MainActivity.respond(MainActivity.java:20)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at com.example.fragment3.FragmentA.onClick(FragmentA.java:39)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.view.View.performClick(View.java:4084)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.view.View$PerformClick.run(View.java:16966)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.os.Handler.handleCallback(Handler.java:615)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.os.Looper.loop(Looper.java:137)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at android.app.ActivityThread.main(ActivityThread.java:4745)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at java.lang.reflect.Method.invokeNative(Native Method)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at java.lang.reflect.Method.invoke(Method.java:511)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-02 11:03:54.569: E/AndroidRuntime(1750):     at dalvik.system.NativeStart.main(Native Method)  
交换后

activity_main.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=".MainActivity" 
    android:id="@+id/main">

  <fragment
        android:id="@+id/fragment2"
        android:name="com.example.fragment3.FragmentB"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/fragment1"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="40dp" />

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fragment3.FragmentA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/fragment2"
        android:layout_alignParentTop="true"
        android:layout_marginTop="157dp" />

      </RelativeLayout>

FragmentA的OnClick方法:

@Override
public void onClick(View v) {
counter++;
comm.respond("The button was clicked " +counter+ " times");

}  

MainActivity.java

public class MainActivity extends Activity implements communicator{

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

    @Override
    public void respond(String data) {
        FragmentManager manager =getFragmentManager();
        FragmentB f2 =(FragmentB) manager.findFragmentById(R.id.fragment2);
        f2.changeText(data);
    }

    }  

问题是什么,我无法理解片段的这种行为。

1 个答案:

答案 0 :(得分:2)

在你的代码中,你只需要清理和构建项目就没有错。 问题只是一段时间的旧引用仍然存在,以便在解决一些错误或错误后删除旧的引用习惯于clean and run项目。

相关问题