Java 如何在片段中实现侦听器接口?

Java 如何在片段中实现侦听器接口?,java,android,android-fragments,Java,Android,Android Fragments,我试图在一个活动和它上面的片段之间进行通信,我希望每次onclick发生时(onclick在活动中)新的数据(从数据库检索的图像/文本)都被传递到frag中。我做了一个简单的界面来测试(让我知道这是否不适合图像,或者它是否太慢或效率低下),我正在尝试将它包含在我的片段中,因此当出现onclick时,片段会更改图像和文本 以下是简单的接口代码: public interface FragmentCommunicator { public void passDataToFragment(St

我试图在一个活动和它上面的片段之间进行通信,我希望每次onclick发生时(onclick在活动中)新的数据(从数据库检索的图像/文本)都被传递到frag中。我做了一个简单的界面来测试(让我知道这是否不适合图像,或者它是否太慢或效率低下),我正在尝试将它包含在我的片段中,因此当出现onclick时,片段会更改图像和文本

以下是简单的接口代码:

public interface FragmentCommunicator {
    public void passDataToFragment(String someValue);
}
以下是活动代码:

public class RandomActivity extends FragmentActivity implements ActivityCommunicator {

    //viewpager adapter
    private PageAdapter mAdapter;
    private ViewPager viewPager;

    //interface through which communication is made to fragment
    public FragmentCommunicator fragmentCommunicator;

    //Buttons for yes, no, skip
    Button btnYesRandom, btnNoRandom, btnSkipRandom;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_random);

        //set buttons
        btnYesRandom = (Button) findViewById(R.id.btnYesRandom);

        // Initializing pager
        viewPager = (ViewPager) findViewById(R.id.random_pager);

        //calling bundle to attach data to fragment
        Bundle bundle = new Bundle();
        bundle.putString("edttext", "From Activity");

        // set Fragmentclass Arguments
        RandomFragment randFrag = new  RandomFragment();
        randFrag.setArguments(bundle);

        //Setting up fragment
        FragmentManager fm = getFragmentManager();
        mAdapter = new PageAdapter(getSupportFragmentManager(),  new UserUpVotesFragment(), randFrag, new UserDownVotesFragment());
        viewPager.setAdapter(mAdapter);
        // Here you would declare which page to visit on creation
        viewPager.setCurrentItem(1);

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            public void onPageScrollStateChanged(int state) {}
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            public void onPageSelected(int position) {
                // Check if this is the page you want.
                if(position !=1) {
                    //swiping to the right
                    if(position == 0) {
                        Log.e("Swiping", "SWIPING TO THE Right BUT RESET ERR");
                        getIntent().removeExtra("edttext");
                    }

                    //swiping to the left
                    if(position == 2) {
                        Log.e("Swiping", "SWIPING TO THE left BUT RESET ERR");
                    }

                    // RandomFragment randomFrag = (RandomFragment) getFragmentManager().findFragmentById(R.id.fra);

                    viewPager.setCurrentItem(1);
                }
            }
        });

        btnYesRandom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                if(fragmentCommunicator != null)
                    fragmentCommunicator.passDataToFragment("Hi from FragmentActivity");
            }
        });
    }
片段代码:

public class RandomFragment extends Fragment {

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

        //call data from activity bundle
        String strtext = getArguments().getString("edttext");

        View rootView = inflater.inflate(R.layout.fragment_random, container, false);

        RelativeLayout random_frag_layout = (RelativeLayout) rootView.findViewById(R.id.random_frag_layout);

        activityButton = (ImageView) rootView.findViewById(R.id.imagehere);
        //setRetainInstance(true);

        texthere = (TextView) rootView.findViewById(R.id.texthere);
        texthere.setText(strtext);

        return rootView;
    }

    //FragmentCommunicator interface implementation
    public void passDataToFragment(String someValue){
        activityAssignedValue = someValue;
        Log.e("ACTIVITY", activityAssignedValue);
    }
}

什么是活动通讯器


如果您希望沿着这条路线走下去,请让您的
RandomActivity
类实现
FragmentCommunicator
接口,该接口应该在
RandomFragment
类中声明为内部公共接口,或者在其自己的文件中公开(或包本地)。

什么是
ActivityCommunicator


如果您希望沿着这条路线走下去,请让您的
RandomActivity
类实现
FragmentCommunicator
接口,该接口应该在
RandomFragment
类中声明为内部公共接口,或者在其自己的文件中公开(或包本地)。

如果您只有一个片段,然后,您可以直接访问它并通过以下方法发送任何数据:将您的片段设置为字段,并从activity中调用您的
passDataToFragment()


要从片段访问活动,请调用
((RandomActivity)getActivity())。activityMethod()

如果只有一个片段,则可以直接访问它并通过以下方法发送任何数据:将片段设为字段,并从活动中对其调用
passDataToFragment()


要从片段访问活动,请调用
((RandomActivity)getActivity()).activityMethod()

噢,片段与活动完全相同,但从片段返回活动。。。有没有更好的方法,我愿意走最有效的路线,因为我将不断地在图片和文本中传递?哦,这只是一个片段,但从片段回到活动。。。有没有更好的方法,我愿意走最有效的路线,因为我将不断地在一起传递图片和文本?这是添加在onCreateView中还是在片段的确切位置?我希望它能够被调用时,一个按钮被点击在活动侧的方式。。。如果您可以向我展示示例代码,或者告诉我在片段中的确切位置必须调用它。那么,如果我告诉frag新数据,我会在要更改为新数据的方法中调用imageview和textview,还是在删除旧数据的同时如何“膨胀”新视图?调用片段是从
onClick()执行的
在您的活动中,只需调用片段而不是通信器。是的,您可以从片段的
onCreateView()
中的片段调用activity来检查膨胀前的状态。最后一点:您可以直接更新视图,而无需重新充气。这是添加在onCreateView中还是在片段的确切位置?我希望它能够被调用时,一个按钮被点击在活动侧的方式。。。如果您可以向我展示示例代码,或者告诉我在片段中的确切位置必须调用它。那么,如果我告诉frag新数据,我会在要更改为新数据的方法中调用imageview和textview,还是在删除旧数据的同时如何“膨胀”新视图?调用片段是从
onClick()执行的
在您的活动中,只需调用片段而不是通信器。是的,您可以从片段的
onCreateView()
中的片段调用activity来检查膨胀前的状态。最后一点:您可以直接更新视图,而无需重新充气。