使用切换按钮打开和关闭TextToSpeech吗?

问题描述 投票:0回答:1

所以我有一个连接到Firebase的应用程序。该应用程序从Firebase检索数据(字符串)到文本视图中,然后TextToSpeech功能读取文本(不是从textView中读取文本,而是从Firebase实时数据库中检索相同的数据)。我已经使用过onDataChange()方法,因此texttospeech功能会在firebase上发生数据中的任何更改时立即读出文本,而不是单击任何按钮时都将其读出。现在我想在我的应用程序中放置一个切换按钮,并使用它来打开或关闭tts功能,但我无法使其正常工作。当切换按钮关闭时,我希望texttospeech功能停止,并且当按钮状态为开时,我希望texttospeech功能重新打开。这是我尝试的方法:

  mtts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR){
                mtts.setLanguage(Locale.US);    }else{


                Toast.makeText(MainActivity.this, "Couldnt initialize speech function!", Toast.LENGTH_SHORT).show();
            }

        }
    }); mIvToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked){
                            reff = FirebaseDatabase.getInstance().getReference().child("Match").child("Screen1");
                            reff.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                                    String tts= dataSnapshot.getValue().toString();
                                    mtts.speak(tts, TextToSpeech.QUEUE_FLUSH, null);


                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });


                        }else{
                            mtts.stop();
                            mtts.shutdown();



                        }
                    }
                });

TIA!

android-studio firebase-realtime-database text-to-speech android-togglebutton
1个回答
0
投票

当您附加valueEventListener时,只要您将toggle选中为关闭,只要数据发生变化,侦听器都会触发。因此,您应该做的是在完成后删除侦听器:

直接在此之下:

  mtts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR){
                mtts.setLanguage(Locale.US); 

            }else{
Toast.makeText(MainActivity.this, "Couldnt initialize speech function!", Toast.LENGTH_SHORT).show();
            }

        }
    });

添加这些:

    //the reference

reff=FirebaseDatabase.getInstance().getReference().child("Match").child("Screen1");


    //make a listener

    ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

     String tts= dataSnapshot.getValue().toString();
     mtts.speak(tts, TextToSpeech.QUEUE_FLUSH, null);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

    }
};





//toggle

mIvToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
//add listener
reff.addValueEventListener(listener);


}else{
//remove listener
reff.removeEventListener(listener);

mtts.stop();
mtts.shutdown();



}
}
});
© www.soinside.com 2019 - 2024. All rights reserved.