Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java/Android接口无法从子片段到父片段工作_Java_Android_Android Fragments_Interface - Fatal编程技术网

java/Android接口无法从子片段到父片段工作

java/Android接口无法从子片段到父片段工作,java,android,android-fragments,interface,Java,Android,Android Fragments,Interface,我试图在两个片段中交流,主体和儿童。但是,当我在子对象中声明接口以将值传递给主片段时,它可以正常工作,但是当我想从主对象传递给子片段时,它就不起作用了。顺便说一句,这个片段在我的主要活动中。 谢谢你的帮助 错误消息是: Caused by: java.lang.IllegalArgumentException: com.example.example.example.MainActivity must implement interface NotifyOnTutorialPageSelecte

我试图在两个片段中交流,主体和儿童。但是,当我在子对象中声明接口以将值传递给主片段时,它可以正常工作,但是当我想从主对象传递给子片段时,它就不起作用了。顺便说一句,这个片段在我的主要活动中。 谢谢你的帮助

错误消息是:

Caused by: java.lang.IllegalArgumentException: com.example.example.example.MainActivity must implement interface NotifyOnTutorialPageSelected
那么有没有一种不直接使用静态函数传递值的方法呢?因为我注意到只有父级可以实现接口,所以如果我想用接口实现它,我该怎么做呢?顺便说一下,这是为了学习

代码:

//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity {

    FragmentManager fragmentManager;
    TutorialFragment tutorialFragment;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();


        fragmentManager = getSupportFragmentManager();    
        fragmentManager.findFragmentById(R.id.card_message_frag);
        tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);

    }
}
头等舱(由MainActivity调用)

第二课堂(由TutorialFragment调用)

解决方案:

//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity {

    FragmentManager fragmentManager;
    TutorialFragment tutorialFragment;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();


        fragmentManager = getSupportFragmentManager();    
        fragmentManager.findFragmentById(R.id.card_message_frag);
        tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);

    }
}
既然没有人回答这个问题,如果有人有类似的困难,我就把答案留在这里。我通过实现MainActivity的接口解决了这个问题,因此MainActivity将调用childclass并调用方法:

//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity implements NotifyOnTutorialPageSelected{

    FragmentManager fragmentManager;
    TutorialFragment tutorialFragment;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();


        fragmentManager = getSupportFragmentManager();    
        fragmentManager.findFragmentById(R.id.card_message_frag);
        tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);

    }

@Override
    public void notifyOnTutorialPageSelected(int index) {
        FragmentManager fragmentChildManager = tutorialFragment.getChildFragmentManager();
        MultiTabFragment multiTabFragment = (MultiTabFragment) fragmentChildManager.findFragmentById(R.id.multi_tabs_frag);
        multiTabFragment.deselectPreviousTab(index);
    }
}

它对我有用,或者至少对我想要的有用,如果有人有不同的解决方案,请告诉我,谢谢。

您自己抛出异常,因为您的活动没有实现
NotifyOnTutorialPageSelected
接口,并且您的父片段不能实现
OnTabSelected
接口

以下代码需要固定到前两个条件之一为真的位置。顺便说一句,您的else if语句中有一个潜在错误,因为您只检查它是否是
OnTabSelected
实例,但随后将父片段强制转换为
NotifyOnTutorialPageSelected

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (getActivity() instanceof NotifyOnTutorialPageSelected) {
            notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getActivity();
        } else if (getParentFragment() instanceof OnTabSelected) {
            notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getParentFragment();
        } else {
            throw new IllegalArgumentException(activity + " must implement interface " + NotifyOnTutorialPageSelected.class.getSimpleName());
        }

    }
查看您的代码,我看不出您是如何拥有子片段的,因为您的教程片段没有创建子片段

您是否试图让一个活动显示两个可通信的片段

如果是这样的话,请看一看关于如何使用接口实现这一点的说明

编辑:

通过这次学习,您可能会发现代码中还有很多错误。但是,为了让您前进并远离当前错误,请删除
TutorialFragment
片段中的
onAttach
方法,因为它无论如何都是错误的。如果你想让你的
活动
类实现回调接口,那么回调接口就是它要去的地方。既然您不是这样做的,那么检查您的活动是否实现了该特定接口就没有意义了

您的
MultiTabFragment.onAttach
方法只需要以下内容,除非您有时要将片段直接放入活动中:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if (getParentFragment() instanceof OnTabSelected) {
        onTabSelected = (OnTabSelected) getParentFragment();
    } else {
        throw new IllegalArgumentException("Parent Fragment must implement interface " + OnTabSelected.class.getSimpleName());
    }
}
最后,由于您已经在
教程片段
中保留了对
多片段
的引用,请删除
NotifyOnTutorialPageSelected NotifyOnTutorialPageSelected
并直接调用片段

@Override
public void onPageSelected(int position) {  
    multiTabFragment.notifyOnTutorialPageSelected(position); // do something so can communicate with the child fragment
}

已经回答了你的问题!谢谢你,伙计!我现在就试试NotifyOnTutorialPagesSelected=(NotifyOnTutorialPagesSelected)getParentFragment();若您的notifyOnTutorialPageSelected是由子片段实现的,那个么您怎么能从父片段中询问这个问题呢。它应该类似于notifyOnTutorialPageSelected=(notifyOnTutorialPageSelected)getChildFragment()@dex我刚刚更改了它,它仍然说我的主要活动必须实现该接口,而不是childit,但我没有显示所有代码,主活动包含TutorialFragment,其中包含由以下原因引起的childFragmenterror:java.lang.IllegalArgumentException:com.example.example.example。MainActivity@3d1d095必须实现接口NotifyOnTutorialPageSelected@kobbycoder您没有正确设置活动和片段。正如我所提到的,您自己抛出该异常,因为您的活动和父片段没有实现您所期望的接口。那么onTabSelected是如何工作的呢?你能给我举个例子吗?你目前编写代码的方式对我来说毫无意义。你能在你的问题中添加你要添加片段的代码吗?
@Override
public void onPageSelected(int position) {  
    multiTabFragment.notifyOnTutorialPageSelected(position); // do something so can communicate with the child fragment
}