Nabeel Hafeez
Nabeel Hafeez

Reputation: 115

How to control fragments using view pager and action bar?

I am now having an activity containing fragments
[1] , [2] , [3] , [4]
When start the application [1] and [2] run at a time.
when swipe to [2] run [3] and swipe to [3] run [4].
Anyone help for this problem.
I want functionality [1] in [1], [2] in [2], and [3] in [3], [4] in [4] on tab swipe.

below my code fragment [1]:

 @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {        
        view = inflater.inflate(R.layout.meaningview, container, false);

            word = (EditText) view.findViewById(R.id.word);     
            data = (WebView) view.findViewById(R.id.web);

        if(first == 1)
        {
            try {
                dbHelper = new SqlLiteDbHelper(getActivity());
                dbHelper.CopyDataBaseFromAsset();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }
            first++;

        }
        find.setOnClickListener(new OnClickListener() {
            @SuppressWarnings("static-access")
            @SuppressLint({ "NewApi", "DefaultLocale" })
            @Override
            public void onClick(View v) {

                url2 = word.getText().toString().toLowerCase();

                urlword = url2;
                InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                if(url2.isEmpty())
                {
                    Toast.makeText(getActivity(), "Word is missing! ", Toast.LENGTH_LONG).show();
                }
                else
                {
                    try{

                        urdu = dbHelper.getDetail(word.getText().toString());
                        urdu_meaning.setText(urdu.Meaning.toString());
                    }catch(Exception e){
                        e.printStackTrace();
                        urdu_meaning.setText("Urdu word not found");
                    }

                    if (mWifi.isConnected())
                    {
                        data.loadUrl(url1 + url2);
                    }
                    else
                    {
                        Toast.makeText(getActivity(), "Network Problem", Toast.LENGTH_LONG).show();
                        //wifiManager.setWifiEnabled(true);

                    }
                }
            }
        });
        return view;
    }

fragment [2]

 @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                            Bundle savedInstanceState) {  
     view = inflater.inflate(R.layout.image, container, false);
     imageView = (ImageView)  view.findViewById(R.id.ImageView);
     imageURL1 = imageURL + MeaningFragment.urlword + ".jpg";
             // Execute the task
     GetXMLTask task = new GetXMLTask();
     task.execute(imageURL1);
     return view;
      }

Fragment [3]

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

            view = inflater.inflate(R.layout.audio, container, false);

    audioURL2 = MeaningFragment.urlword + ".mp3";
                try{
                    if (isPlayed) { // if media player had played, this function is called
                        start();
                    }else {

                        try {
                            //pDialog.show();
                            mPlayer =new MediaPlayer();
                            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

                            mPlayer.setDataSource(audioURL+audioURL2);
                            ac = new MediaController(getActivity());

                            ac.setAnchorView(view.findViewById(R.id.reference));
                            ac.setMediaPlayer(AudioFragment.this);
                            mPlayer.setOnCompletionListener(AudioFragment.this);
                            mPlayer.setOnPreparedListener(AudioFragment.this);

                        } catch (IOException e) {
                            //e.printStackTrace();
                            Toast.makeText(getActivity(), "Audio URL Not Found! ", Toast.LENGTH_LONG).show();

                        }
                        try {
                            mPlayer.prepare();
                            mPlayer.start();

                        } 
                        catch (Exception e)
                        {
                            e.printStackTrace();
                            //urdu_meaning.setText("Audio Not Found");
                            Toast.makeText(getActivity(), "Audio not Found!", Toast.LENGTH_LONG).show();
                        }           

                    }
                }

and Fragment [4] on same method

Upvotes: 0

Views: 1108

Answers (2)

Nabeel Hafeez
Nabeel Hafeez

Reputation: 115

I have Main activity for setOnPageChangeListener and another activity (ViewpageAdapter) for getItem.... as below

ViewpagerAdpater

@Override
    public Fragment getItem(int position) {
        switch (position) {

        // Open FragmentTab1.java
    case 0:
        MeaningFragment meaningtab = new MeaningFragment();

        return meaningtab;
        // Open FragmentTab2.java
    case 1:
        ImageFragment imagetab = new ImageFragment();
        return imagetab;

    case 2:

        AudioFragment audiotab= new AudioFragment();
        return audiotab;

    case 3:
        VideoFragment videotab = new VideoFragment();
        return videotab;

    }
    return null;
}

MainActivity

// Adding Tabs
            for (String tab_name : tabtitles) {

            actionBar.addTab(actionBar.newTab().setText(tab_name)
                    .setTabListener(this));
        }
        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
                MainActivity.position = position;
                Log.i("Position", "Meaning =" + position);
                Log.i("Main Position", "Meaning =" + MainActivity.position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

}



@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
     viewPager.setCurrentItem(tab.getPosition());

}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub

}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {

    // TODO Auto-generated method stub
}

still in problem. i set log for position for every fragment when I swipe tabs then in onpagelistner show accurate position of every tab but in [1] and [2] show position 0 and [3] in position 1 and [4] in position 2.

Upvotes: 1

kris larson
kris larson

Reputation: 30985

The way the FragmentPagerAdapter works is that it loads the Fragment ahead of the one you have scrolled to. So when you start the application, fragment 1 loads and displays, fragment 2 is loaded and ready for display. Then when you swipe, the pre-loaded fragment 2 is displayed and fragment 3 is loaded.

So if you want code to execute when the fragment is displayed in the view pager, you cannot put this logic in onCreateView().

If you want logic to be executed when the fragment is displayed, you need to create a ViewPager.OnPageChangeListener and call ViewPager.setOnPageChangeListener() for the view pager with your listener. In your OnPageChangeListener, you implement the method onPageSelected. That will tell you when the fragment has displayed by a swipe. The parameter to onPageSelected is the index of the fragment that was displayed, so you can tell which fragment is now visible.

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

    public void onPageSelected(int page) {

        switch (page) {
        case 0:
            // code for first page displayed
            break;
        case 1:
            // code for second page displayed
            break;
        case 2:
            // code for third page displayed
            break;
        case 3:
            // code for fourth page displayed
            break;
        }
    }

    // you also have to create empty impls for the other two methods
    .
    .
    .

});

Just a note: If I remember correctly from when I used this, onPageSelected is only called on a swipe, so it might not be called the very first time your view pager is displayed. For that event, you might have to call something from the method that creates/displays your view pager.

Upvotes: 1

Related Questions