android - 为什么 tts 没有改变 Android Fragment 中的语言但在 Activity 中工作正常?
问题描述
因此,我一直在尝试更改片段中的 TTS 语言,但它不起作用,但相同的代码在 MainActivity 中可以正常工作。我不明白为什么。我检查了其他解决方案,但没有一个对我有用。我尝试了不同的解决方案,解决方案,但即使这样也不起作用。
public class HomeFragment extends Fragment implements TextToSpeech.OnInitListener{
private static final int TTS_DATA_CHECK = 1;
private TextToSpeech engine;
private SettingsViewModel settingsViewModel;
private EditText textMsg;
private Button button;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
engine = new TextToSpeech(getContext(),this);
settingsViewModel = new ViewModelProvider(getActivity()).get(SettingsViewModel.class);
return inflater.inflate(R.layout.fragment_home, container, false);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textMsg = view.findViewById(R.id.textMsg);
button = view.findViewById(R.id.playButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
engine.speak(textMsg.getText().toString(), TextToSpeech.QUEUE_FLUSH, null,null);
}
});
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
settingsViewModel.getLanguage().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("LANGUAGE_SELECTED",s);
switch (s){
case "ENGLISH":
engine.setLanguage(Locale.ENGLISH);
break;
case "FRENCH":
engine.setLanguage(Locale.FRENCH);
break;
}
}
});
}
@Override
public void onInit(int status) {
if(status==TextToSpeech.SUCCESS){
int result = engine.setLanguage(Locale.ENGLISH);
if(result == TextToSpeech.LANG_MISSING_DATA
|| result== TextToSpeech.LANG_NOT_SUPPORTED){
Toast.makeText(getContext(),"Not supported",Toast.LENGTH_LONG).show();
}
}else{
Toast.makeText(getContext(),"TTS is missing",Toast.LENGTH_LONG).show();
}
}
}
解决方案
首先,您需要像这样在主要活动中初始化 TTS -
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
private static final int TTS_DATA_CHECK = 101;
static TextToSpeech engine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
engine = new TextToSpeech(this,this);
}
@Override
public final void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 101)
{
if (resultCode != TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
{
final Intent tnt = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(tnt);
}
}
}
@Override
public void onInit(int status) {
if(status==TextToSpeech.SUCCESS){
if(TTS_DATA_CHECK == TextToSpeech.LANG_MISSING_DATA
|| TTS_DATA_CHECK== TextToSpeech.LANG_NOT_SUPPORTED){
Toast.makeText(this,"Not supported",Toast.LENGTH_LONG).show();
}
}
}
static public TextToSpeech getInstance() {
return engine;
}
}
然后你必须像这样在 Fragment 中调用 TTS 实例。请注意,MainActivity 是给定 Fragment 的父活动。
现在用此代码替换片段中的以下代码 -
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("VMA","OnActivityCreated");
settingsViewModel.getLanguage().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("VMA","LANGUAGE_SELECTED " + s);
switch (s){
case "FRENCH":
MainActivity.getInstance().setLanguage(Locale.FRENCH);
break;
case "ENGLISH":
MainActivity.getInstance().setLanguage(Locale.ENGLISH);
break;
}
}
});
}
此外,您可以从 Fragment 中删除其余的 TTS 代码。你不再那样了。
推荐阅读
- typescript - 是否可以动态地在泛型类型中使用 import()
- java - 在 Spring Boot 中编辑时选择多选中的项目
- dynamics-crm - 如何获取不在特定队列/团队中的用户?
- highcharts - Highcharts .Net(最新)YAxis.GridLineDashStyle Hashtable 不适用于客户端库
- perl - Perl - 如何从数组 M 维计算 N 个字节的 CRC16(使用 N
我需要计算从大小为 M 的二进制文件(一对 Kb,与我的范围不太相关)中提取的 N 字节(示例中为 5,为简单起见)的 CRC16。
printf "offset\tvalue\tcrc16\n"; #Read N bytes from file and copy in the container
- r - 子集,未按预期选择
- spring-cloud-dataflow - Spring Cloud 数据流:错误 org.springframework.dao.InvalidDataAccessResourceUsageException
- next.js - NextJS 语言环境随动态路由变化
- c++ - 如何使用 ESPAsyncTCP 库在 ESP8266 上设置 TCP 服务器以及指针如何工作
- amazon-athena - Athena Engine V1 到 V2 在结构列上变慢