我一直在看stackoverflow来解决我的问题并找到了一些相当不错的东西,但它对我不起作用或者我很愚蠢地看到它(如何实现OnFragmentInteractionListener)
我想在Frame中放置一个片段,所以我创建了它,依此类推.我必须实现一个接口及其方法.我(想)我做到了,但我的应用程序每次都崩溃了......
*编辑:我的应用程序崩溃,当我调用openHome或openRecommended时,onCreate方法有效,我收到这些错误,但所有内容都正确显示.
这是我的代码:
MainActivity.java
import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener, RecommendedFragment.OnFragmentInteractionListener { FragmentTransaction fragmentTransaction; HomeFragment homeFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); homeFragment = new HomeFragment(); getFragmentManager().beginTransaction().add(R.id.mainFrame, homeFragment).commit(); } protected void openHome(View view) { /*Intent homeIntent = new Intent(this, HomeFragment.class); startActivity(homeIntent); homeFragment = new HomeFragment(); getFragmentManager().beginTransaction().replace(R.id.mainFrame, homeFragment).commit();*/ System.out.println("Success"); } public void openRecommended(View view) { Intent recommendedIntent = new Intent(this, RecommendedFragment.class); startActivity(recommendedIntent); RecommendedFragment recommendedFragment = new RecommendedFragment(); getFragmentManager().beginTransaction().replace(R.id.mainFrame, recommendedFragment).commit(); } @Override public void onFragmentInteractionHome(Uri uri) { } @Override public void onFragmentInteractionRecommended(Uri uri) { } }
HomeFragment.java
import android.app.Activity; import android.app.Fragment; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link HomeFragment.OnFragmentInteractionListener} interface * to handle interaction events. * Use the {@link HomeFragment#newInstance} factory method to * create an instance of this fragment. */ public class HomeFragment extends Fragment { private OnFragmentInteractionListener mListener; public static HomeFragment newInstance() { HomeFragment fragment = new HomeFragment(); return fragment; } public HomeFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false); } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteractionHome(uri); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * * See the Android Training lesson Communicating with Other Fragments for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name public void onFragmentInteractionHome(Uri uri); } }
除了某些方法具有不同的名称外,RecommendedFragment看起来相同.
我总是得到这个错误:
java.lang.RuntimeException:无法启动活动ComponentInfo {com.domain.app/com.domain.app.MainActivity}:java.lang.ClassCastException:com.domain.app.MainActivity@b1d296b0必须在android.app上实现OnFragmentInteractionListener. Activity.Thread.performLaunchActivity(ActivityThread.java:2195)位于android.app.A活动时,我在Android.app.ActivityThread.access $ 800(ActivityThread.java:135)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)上运行. handleMessage(ActivityThread.java:1196)位于android.app.AutT.Dop上的android.O.Randper.loop(Looper.java:136)的android.os.Handler.dispatchMessage(Handler.java:102)(ActivityThread.java) :5017)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit) .java:779)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)at dalvik.system.NativeStart.main(Native Method)引起:java.lan g.ClassCastException:com.domain.app.MainActivity@b1d296b0必须在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:849)的com.domain.app.HomeFragment.onAttach(HomeFragment.java:74)上实现OnFragmentInteractionListener .app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)位于android.app.A活动中的android.app.BackStackRecord.run(BackStackRecord.java:684)android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447).在android.app.A活动时,在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)的android.app.ActivityThread.access $ 800(ActivityThread.)的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)上执行启动(Activity.java:5240). java:135)在android.app.A.运行时,Android.O.Roper.loop(Looper.java:136)上的android.app.Handler.dispatchMessage(Handler.java:102)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196) )在android.app.ActivityT hread.main(ActivityThread.java:5017)位于com.android.internal.os的java.lang.reflect.Method.invoke(Method.java:515)的java.lang.reflect.Method.invokeNative(Native Method)中. ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)at dalvik.system.NativeStart.main(Native Method)
我真的需要帮助,我被困了几个小时......
约翰