当前位置: 首页 > 知识库问答 >
问题:

在旋转器中显示TTS可用语言

马华茂
2023-03-14

我最近开始编写android程序,我想看看有哪些语言的文本到语音可用在设备上,并显示在一个旋转器,但我遇到了一个非常奇怪的问题。

下面是代码的相关部分:

package com.example.dshawn.ttsapp;

import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.*;

public class MainActivity extends AppCompatActivity implements

        AdapterView.OnItemSelectedListener {
    private TextToSpeech mTTS;
    Locale[] locales = Locale.getAvailableLocales();
    List<Locale> localeList = new ArrayList<Locale>();
    List<String> country=  new ArrayList<String>();
    List<String> asdf=  new ArrayList<String>();


    int sum=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                if (i==TextToSpeech.SUCCESS){
                    for (Locale locale : locales) {
                        int res = mTTS.isLanguageAvailable(locale);
                        if (res == TextToSpeech.LANG_COUNTRY_AVAILABLE) {
                            sum++;
                            localeList.add(locale);
                            country.add(locale.getDisplayName());
                        }
                    }
                    asdf.add(Integer.toString(sum));


                }

            }
        });
        //Getting the instance of Spinner and applying OnItemSelectedListener on it

        Spinner spin = (Spinner) findViewById(R.id.spinner);
        spin.setOnItemSelectedListener(this);

        //Creating the ArrayAdapter instance having the country list
        ArrayAdapter<String> aa = new  ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,country);
        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //Setting the ArrayAdapter data on the Spinner
        spin.setAdapter(aa);

    }

    //Performing action onItemSelected and onNothing selected
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
        Toast.makeText(getApplicationContext(),country.get(position) , Toast.LENGTH_LONG).show();
    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }
}

在这个TTS初始化之后,我尝试并打印sum,它显示为0。我尝试通过执行类似String=country.get(1)的操作来访问localeList和country中的元素;它会在编译器中给出一个错误,说我试图访问的索引不存在,列表中有0个元素。在这一点上,设备上似乎没有可用的语言,但奇怪的是,当我通过ArrayAdapter将国家数组列表放入我的旋转器下拉菜单时,我设备上实际可用的国家确实会显示在旋转器菜单中,但它是坏的,这里是我的意思的gif:

旋转器永远不会进入我的onItemSelected侦听器,并且项在单击后不会显示在旋转器中。我进入了设备的设置,那些显示的确实是该设备上TTS的可用区域设置。当我删除代码中似乎从未访问过的“if(res==TextToSpeech.lang_Country_Available)”部分时,旋转器下拉菜单中就没有任何内容了。所以它明显地以某种方式抓取了可用的区域设置,但当我试图访问arraylist时,它的行为就像它是空的,但它以某种方式使用“空的”arraylist并将正确的国家/地区放入旋转框中,但旋转框被破坏了,大概是因为arraylist被破坏了,因为我对手工填充的arraylist尝试了同样的操作,元素正常显示,我可以正常选择它。

这里有什么问题?我已经尝试了我能想到的一切,我只知道问题出在TTS初始化部分。

基本上,我无法访问在TTS的“oninit”方法中设置或添加的任何项,这也会导致我的旋转器中断。

共有1个答案

司马飞
2023-03-14

我认为问题是您在列表填充之前(因为TTS还没有初始化)创建适配器(使用国家列表)。

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private TextToSpeech mTTS;
    Locale[] locales = Locale.getAvailableLocales();
    List<Locale> localeList = new ArrayList<Locale>();
    List<String> country = new ArrayList<String>();

    // * - Move these two variables out here
    ArrayAdapter<String> aa;
    Spinner spin;

    int sum = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        Log.i("XXX", "onCreate() was called");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                if (i == TextToSpeech.SUCCESS) {
                    // * - delay important tasks until TTS is initialized
                    startWhenTTSIsInitialized();
                }
            }
        });

        //Getting the instance of Spinner and applying OnItemSelectedListener on it
        spin = (Spinner) findViewById(R.id.spinner);

    }

    private void startWhenTTSIsInitialized() {

        Log.i("XXX", "startWhenTTSIsInitialized() was called");
        for (Locale locale : locales) {
            int res = mTTS.isLanguageAvailable(locale);
            if (res == TextToSpeech.LANG_COUNTRY_AVAILABLE) {
                sum++;
                localeList.add(locale);
                // * - 'country' is used to populate the adapter, so
                // this line must come first
                country.add(locale.getDisplayName());
            }
        }

        //Creating the ArrayAdapter instance having the country list
        // * - now it's safe to set the adapter because the country list has been populated
        aa = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, country);
        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //Setting the ArrayAdapter data on the Spinner
        spin.setAdapter(aa);
        spin.setOnItemSelectedListener(this);

    }

    //Performing action onItemSelected and onNothing selected
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {

        Log.i("XXX", "onItemSelected() was called");
        Toast.makeText(getApplicationContext(), country.get(position), Toast.LENGTH_LONG).show();

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {

        // TODO Auto-generated method stub

    }

}
 类似资料:
  • 我用自定义适配器创建了一个旋转器,其中我有一个图像视图和一个文本视图,当我从旋转器中选择项目时,我用选定的项目显示图像,这是完美的工作。 问题: 但问题是当我选择任何项目时,它会在下拉框中显示选定项目的图像。并在旋转器中显示相同的(图像和文本)…

  • 最后,这是我想从中提取的字符串数组文件(我是把我的字符串数组放在它自己的文件中的values文件夹中,还是放在字符串文件中,我都看过了,不知道是哪个,谢谢) 因此,我要重述一下我的问题,我需要使用还是,我如何设置我的ArrayAdapter,以及我需要把我的string-array放在哪里? 先谢谢您!

  • null 请注意,我试图展示一个本地旋转器。谢了!

  • 我知道这已经被问了很多次了,但没有任何答案可以帮助我。 我有一个对话框,它将在某个时刻弹出(当我调用方法“showServerDialog”时)。对话框显示出来,一切正常,直到我使用“negativeButton”关闭对话框,然后旋转屏幕。然后,对话框再次出现,尽管我取消了它。 我读了很多次,如果我使用show Dialog(int id)方法显示对话框并覆盖onCreateDialog(int

  • 在线语音合成(tts) 概述 该API将文本转换为语音文件,支持不同编码格式和采样率. 调用示例 curl -sSL -v -X POST "https://ai.nationalchip.com/api/v1/tts" -H "accept: */*" -H "Authorization: Bearer ${access_token}" -H "Content-Type: applicatio

  • 问题内容: 我正在尝试创建一个Rotatable ImageView,我将向其指定特定角度和枢轴点,并查看其围绕该枢轴点旋转。我尝试过这样的事情: 但是postRotate方法的参数(第二个和第三个-枢轴点)完全没有变化。即使它们是0、0,也一样。 所以我想创建一个ImageView,在初始化时将旋转一定角度。在此示例中为45度。我试图设置范围和人员..没有帮助。 我怎么做?:/ 问题答案: 您可