1

I am implementing a dictionary.There's activity(WordMeaningActivity) which displays meaning of a word. It consists of fragment and viewPager(swipe view). Fragments are populated using fragmentStatePagerAdapter. In each fragment there is a speaker button which implements text-to-speech. When tts is off, icon of button is a speaker otherwise when it speaks icon changes to a mute. I am providing link of images- image with speaker icon(tts doesn't speak)

image with mute icon(tts speaks)

I have two problems- 1) when i swipe and change the fragment(when tts is speaking) it stops speaking but when i swipe back to that fragment, icon doesn't changes (remains the mute one), should be speaker instead. onPause,onStop isn't working. I preserved the previous position and fragment itself using hashmap and in method onPageSelected, I accesed the fragment and changed the icon but after few swipes(both left and right) it throws NullPointerException.

2)when tts completes it's speech it doesn't change the icon. onDone in setOnUtteranceProgressListener isn't changing icon. Here's the code-

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_word_meaning);

    initViews();

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    setTitle(title);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    mViewPager.setPageTransformer(true, new ViewPager.PageTransformer() {
        @Override
        public void transformPage(View page, float position) {
            if (position < -1) {
                // [-00,-1): the page is way off-screen to the left.
                 right = true;


            } else if (position <= 1) {
                // [-1,1]: the page is "centered"
            } else {
                // (1,+00]: the page is way off-screen to the right.
                left = true;
            }
        }
    });

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            posOffset = positionOffset;
        }

        @Override
        public void onPageSelected(int position) {
            String word = list.get(position);
            insertToRecent(word);

            PlaceholderFragment frag;

                if (right) {
                    frag = fragMap.get(position - 1);
                    frag.btnspeak.setBackgroundResource(R.drawable.speaker);
                    right = false;
                } else if (left) {
                    frag = fragMap.get(position + 1);
                    frag.btnspeak.setBackgroundResource(R.drawable.speaker);
                    left = false;
                }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
    mViewPager.setCurrentItem(position);
}

code for my fragment-

    public static class PlaceholderFragment extends Fragment{

    TextView txtMeaning,txtHeading;
    String word,meaning;
    boolean on,speaker;
    Button btnspeak,btnfav,btnshare;
    static TextToSpeech tts;
    int prevFragPos;

    public PlaceholderFragment() {
    }

    public  PlaceholderFragment newInstance(String w,String m, boolean bool) {

        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putString("word", w);
        args.putString("meaning",m);
        args.putBoolean("fabState",bool);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        word=getArguments().getString("word");
        on=getArguments().getBoolean("fabState");
        meaning=getArguments().getString("meaning");

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

        txtMeaning = (TextView) rootView.findViewById(R.id.txtMeaning);
        txtHeading = (TextView)rootView.findViewById(R.id.textHeading);
        btnspeak = (Button) rootView.findViewById(R.id.speaker);
        btnfav = (Button)rootView.findViewById(R.id.fav);
        btnshare = (Button)rootView.findViewById(R.id.share);

        txtHeading.setText(word);
        txtMeaning.setText(meaning);

        btnspeak.setBackgroundResource(R.drawable.speaker);

        speaker=false;

        Bundle bun = this.getArguments();
        prevFragPos = bun.getInt("fragPos") - 1;
        posSend = bun.getBoolean("bool");

        final HashMap<String, String> map = new HashMap<String, String>();
        map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"messageID");


        tts=new TextToSpeech(getActivity(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status!=TextToSpeech.ERROR){
                    tts.setLanguage(Locale.ENGLISH);
                }
            }
        });

        if(on){
            btnfav.setBackgroundResource(R.drawable.star_on);
        }
        else{
            btnfav.setBackgroundResource(R.drawable.star_border);
        }

        btnspeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (speaker == false) {
                    speaker = true;
                    btnspeak.setBackgroundResource(R.drawable.mute);
                    tts.speak(meaning, TextToSpeech.QUEUE_FLUSH, map);
                } else {
                    speaker = false;
                    btnspeak.setBackgroundResource(R.drawable.speaker);
                    tts.stop();
                }
            }
        });

        tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onStart(String utteranceId) {
            }

            @Override
            public void onDone(String utteranceId) {
                btnspeak.setBackgroundResource(R.drawable.speaker); //not working
            }

            @Override
            public void onError(String utteranceId) {
            }
        });



        btnfav.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickFavourites(v, on, word)) {
                    btnfav.setBackgroundResource(R.drawable.star_on);
                    on = true;
                } else {
                    btnfav.setBackgroundResource(R.drawable.star_border);
                    on = false;
                }
            }
        });

        btnshare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent waIntent = new Intent(Intent.ACTION_SEND);
                waIntent.setType("text/plain");
                waIntent.putExtra(Intent.EXTRA_TEXT, word + " - \n" + meaning);
                startActivity(Intent.createChooser(waIntent, "Share with"));


            }
        });

        return rootView;
    }

    @Override
    public void onDestroyView() {
        if(tts!=null){
            tts.stop();
            tts.shutdown();
        }
        super.onDestroyView();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}

code for fragment's adapter-

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {



    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        String word=list.get(position);
        String m=getMeaning(word);
        boolean on=checkIfFav(word);

        PlaceholderFragment fragment = new PlaceholderFragment().newInstance(word, m, on);

        fragMap.put(position, fragment);

        return fragment;
    }

    @Override
    public int getCount() {
        return list.size();
    }
}

Thanks in advance for help!

mb_96
  • 127
  • 1
  • 2
  • 9

0 Answers0