java Android:片段交互侦听器出错
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25753953/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: error with on fragment interaction Listener
提问by JRsz
I have been looking at stackoverflow to solve my problem and found something pretty good, but it does not work for me or I am to stupid to see it (How to implement OnFragmentInteractionListener)
我一直在寻找 stackoverflow 来解决我的问题并发现了一些很好的东西,但它对我不起作用,或者我看到它很愚蠢(如何实现 OnFragmentInteractionListener)
I want to place a fragment inside a Frame, so I created it and so on. I have to implenet an interface and its method. I (think) I did it, but my App crashes everytime...
我想在一个框架内放置一个片段,所以我创建了它等等。我必须实现一个接口及其方法。我(认为)我做到了,但我的应用程序每次都崩溃......
*Edit: My App crashes, when I call openHome or openRecommended, the onCreate method works, I get these errors, but everything is beeing displayed correctly.
*编辑:我的应用程序崩溃,当我调用 openHome 或 openRecommended 时,onCreate 方法有效,我收到这些错误,但一切都正确显示。
This is my code:
这是我的代码:
MainActivity.java
主活动.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
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.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener
{
// TODO: Update argument type and name
public void onFragmentInteractionHome(Uri uri);
}
}
RecommendedFragment looks the same, except some methods have a different name.
RecommendedFragment 看起来相同,除了一些方法具有不同的名称。
I always get this error:
我总是收到这个错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.domain.app/com.domain.app.MainActivity}: java.lang.ClassCastException: com.domain.app.MainActivity@b1d296b0 must implement OnFragmentInteractionListener at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(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) Caused by: java.lang.ClassCastException: com.domain.app.MainActivity@b1d296b0 must implement OnFragmentInteractionListener at com.domain.app.HomeFragment.onAttach(HomeFragment.java:74) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:849) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.Activity.performStart(Activity.java:5240) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) ????????????at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) ????????????at android.app.ActivityThread.access$800(ActivityThread.java:135) ????????????at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) ????????????at android.os.Handler.dispatchMessage(Handler.java:102) ????????????at android.os.Looper.loop(Looper.java:136) ????????????at android.app.ActivityThread.main(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.lang.RuntimeException:无法启动活动 ComponentInfo{com.domain.app/com.domain.app.MainActivity}:java.lang.ClassCastException:com.domain.app.MainActivity@b1d296b0 必须在 android.app 实现 OnFragmentInteractionListener。 ActivityThread.performLaunchActivity(ActivityThread.java:2195) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H。 handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java) :5017) 在 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.lang.ClassCastException:com.domain.app.MainActivity@b1d296b0 必须在 com.domain 实现 OnFragmentInteractionListener。 app.HomeFragment.onAttach(HomeFragment.java:74) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:849) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run (BackStackRecord.java:684) 在 android.app.FragmentManagerImpl。execPendingActions(FragmentManager.java:1447) at android.app.Activity.performStart(Activity.java:5240) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) ????????????在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) ???????????? 在 android.app.ActivityThread.access$800(ActivityThread.java:135) ????????? ?????at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) ????????????at android.os.Handler.dispatchMessage(Handler.java:102) ? ????????????at android.os.Looper.loop(Looper.java:136) ????????????at android.app.ActivityThread.main(ActivityThread.java :5017) ????????????在 java.lang.reflect.Method.invokeNative(Native Method) ????????????在 java.lang.reflect.Method。 invoke(Method.java:515) ???????????? 在 com.android.internal.os。ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) ???????????? 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) ????????? ?????at dalvik.system.NativeStart.main(本机方法)
I really need help here, I am stuck for hours...
我真的需要帮助,我被困了几个小时......
John
约翰
回答by Víctor Albertos
I've removed useless references and everything related with RecommendedFragment class. If you post it I will update my answer.
我已经删除了无用的引用以及与RecommendedFragment 类相关的所有内容。如果您发布它,我会更新我的答案。
I've tested it and it works. But try to explain what is the meaning of openHome() method, because it is never used based on your code, and nevertheless you say that the app crashes when you call it.
我已经测试过它并且它有效。但是尝试解释 openHome() 方法的含义是什么,因为根据您的代码从未使用过它,尽管如此,您还是说当您调用它时应用程序崩溃了。
I added this method to the interface because it seems to me the most logical thing to do.
我将此方法添加到界面中,因为在我看来这是最合乎逻辑的事情。
? //MainActivity
? //主要活动
public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFragmentManager().beginTransaction()
.add(R.id.mainFrame, new HomeFragment())
.commit();
}
@Override
public void openHome(View view) {
System.out.println("Success");
}
@Override
public void onFragmentInteractionHome(Uri uri) {
Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
}
}
//HomeFragment
//首页片段
public class HomeFragment extends Fragment {
private OnFragmentInteractionListener mListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteractionHome(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
mListener.onFragmentInteractionHome(Uri.parse("doWhatYouWant"));
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
public void onFragmentInteractionHome(Uri uri);
public void openHome(View view);
}
}
回答by Tasnuva oshin
Just Remove OnAttach() Method From Fragment
只需从片段中删除 OnAttach() 方法