簡體   English   中英

如何實現片段的偵聽器接口?

[英]How to implement listener interface in fragment?

我試圖在活動和位於活動之上的片段之間進行通信,我希望每次onclick發生時(活動中的onclick)都將新數據(圖像/文本-從db中檢索到)傳遞到碎片中。 我做了一個簡單的界面進行測試(讓我知道它是否不適合圖像,或者它是否太慢或效率低下),並且我試圖將其包含在片段中,因此當發生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);
    }
}

如果只有一個片段,則可以直接通過方法訪問它並發送任何數據:將片段設置為一個字段,然后從Activity對其調用passDataToFragment()

要從片段訪問活動,請調用((RandomActivity)getActivity()).activityMethod()

什么是ActivityCommunicator

如果您想走這條路,請讓您的RandomActivity類實現FragmentCommunicator接口,該接口應在RandomFragment類中聲明為內部公共接口,或者在其自己的文件中公開(或打包為本地)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM