Android 将接口传递给片段 让我们考虑一个例子,我有片段A < /C>和片段b > /p>

Android 将接口传递给片段 让我们考虑一个例子,我有片段A < /C>和片段b > /p>,android,android-fragments,android-bundle,Android,Android Fragments,Android Bundle,B声明: public interface MyInterface { public void onTrigger(int position); } A实现此接口 当将Fragment B推入堆栈时,我应该如何在Bundle中为其传递Fragment A的引用,以便A可以在需要时获得onTrigger回调 我的用例场景是A有ListView和B有ViewPager和项目。两者都包含相同的项,当用户在弹出B之前从B->A转到B时,它应该触发A的回调,以更新其ListView位置以匹配B寻

B
声明:

public interface MyInterface {
    public void onTrigger(int position);
}
A
实现此接口

当将
Fragment B
推入堆栈时,我应该如何在
Bundle
中为其传递
Fragment A
的引用,以便
A
可以在需要时获得
onTrigger
回调

我的用例场景是
A
ListView
B
ViewPager
和项目。两者都包含相同的项,当用户在弹出
B
之前从
B->A
转到
B
时,它应该触发
A
的回调,以更新其
ListView
位置以匹配
B
寻呼机位置

谢谢

Passing interface to Fragment
我认为您是在两个
片段

为了做到这一点,您可以查看


使用@Amit的答案,并根据OPs问题进行调整,以下是所有相关代码:

public class FragmentA extends BaseFragment implements MyInterface {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // THIS IS JUST AN EXAMPLE OF WHERE YOU MIGHT CREATE FragmentB
        FragmentB myFragmentB = new FragmentB();        
    }


    void onTrigger(int position){
        // My Callback Happens Here!
    }
}


适用于Kotlin 1.0.0-beta-3595

interface SomeCallback {}

class SomeFragment() : Fragment(){

    var callback : SomeCallback? = null //some might want late init, but I think this way is safer

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        callback = activity as? SomeCallback //returns null if not type 'SomeCallback'

        return inflater!!.inflate(R.layout.frag_some_view, container, false);
    }
}

对于两个片段来说,最好只通过一个活动进行通信。因此,您可以在片段B中定义在活动中实现的接口。然后在活动中,在接口方法中定义希望在片段A中发生什么

在片段B中

MyInterface mCallback;
 public interface MyInterface {
        void onTrigger(int position);
    }

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (MyInterface) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement MyInterface");
        }
}
确定用户是否从B转到A的方法

public void onChangeFragment(int position){
//other logic here
 mCallback.onTrigger(position);
}
在活动中,

public void onTrigger(int position) {
    //Find listview in fragment A
    listView.smoothScrollToPosition(position);
    }

祝你好运

我认为你应该使用沟通,正如我在下面写的那样。此代码来自:

标题片段

public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

public void setOnHeadlineSelectedListener(Activity activity) {
    mCallback = activity;
}

// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

// ...
}
main活动

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
// ...

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof HeadlinesFragment) {
        HeadlinesFragment headlinesFragment = (HeadlinesFragment) fragment;
        headlinesFragment.setOnHeadlineSelectedListener(this);
    }
}

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener {
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article
}

但我的活动与这两个无法交流的片段无关,难道没有其他解决方案吗?@Niko你能用一些用户界面再解释一下吗。所以我可以帮你。用用例更新了我的问题。Android文档的链接帮助我完成了这项工作。我做了同样的工作,但没有在片段A中得到回调,但我在活动中得到回调。与其链接,不如将最相关的部分作为引用块包含在你的答案中,并提供链接作为reference@MyStackRunnethOver我做了soAh,代码是引用。那么也许你的第一句话应该是:“我认为你应该使用沟通,正如我在下面写的。这段代码来自”
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

public void setOnHeadlineSelectedListener(Activity activity) {
    mCallback = activity;
}

// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
}

// ...
}
public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
// ...

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof HeadlinesFragment) {
        HeadlinesFragment headlinesFragment = (HeadlinesFragment) fragment;
        headlinesFragment.setOnHeadlineSelectedListener(this);
    }
}

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener {
...

public void onArticleSelected(int position) {
    // The user selected the headline of an article from the HeadlinesFragment
    // Do something here to display that article
}