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

Toggle TextToSpeech on and off using a togglebutton?

所以我有一个连接到 firebase 的应用程序。该应用程序将数据(字符串)从 firebase 检索到文本视图中,然后 TextToSpeech 功能读出文本(不是从 textView 中读取,而是它本身从 firebase 实时数据库中检索相同的数据)。我使用了 onDataChange() 方法,因此一旦数据发生任何变化,texttospeech 功能就会在 firebase 上读出文本,而不是在单击任何按钮时读出文本。现在我想在我的应用程序中放置一个切换按钮并使用它来打开或关闭 tts 功能,但我无法让它工作。当切换按钮关闭时,我希望 texttospeech 功能停止,当按钮状态打开时,我希望 texttospeech 功能返回 on.This 我试过的是:

  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 !

当您附加 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();



}
}
});