我有两个Fragments
,一个Activity
和一个Interface
FragmentA
包含一个Button
,FragmentB
包含一个TextView
和MainActivity
实现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);
}
}
问题是什么,我无法理解片段的这种行为。
答案 0 :(得分:2)
在你的代码中,你只需要清理和构建项目就没有错。
问题只是一段时间的旧引用仍然存在,以便在解决一些错误或错误后删除旧的引用习惯于clean and run
项目。