简体   繁体   English

为Spinner设置事件处理程序时发生NullPointerException

[英]NullPointerException when setting the Event Handler for Spinner

I am having some issues with the android Spinner. 我在使用Android Spinner时遇到了一些问题。 Please have a look at the below codes. 请看下面的代码。

talk_settings.xml talk_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="17dp"
        android:text="@string/language_locale"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Spinner
        android:id="@+id/language_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_toRightOf="@+id/textView1" 
        android:layout_alignBaseline="@+id/textView1"
        android:entries="@array/locale_arrays"
        android:prompt="@string/locate_prompt"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/spinner1"
        android:layout_marginTop="37dp"
        android:text="@string/pitch" 
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <SeekBar
        android:id="@+id/pitchBar" 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"        
        android:layout_below="@+id/textView2"
        android:layout_marginTop="16dp" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/pitchBar"
        android:layout_marginTop="27dp"
        android:text="@string/speed"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <SeekBar
        android:id="@+id/speedBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView3"
        android:layout_marginTop="18dp" />

</RelativeLayout>

locale_string.xml (string resources for the spinner) locale_string.xml (微调器的字符串资源)

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="locate_prompt">Select Language</string>

    <string-array name = "locale_arrays">
        <item>English</item>
        <item>Chinese</item>
        <item>French</item>
        <item>Germany</item>
        <item>Italian</item>
        <item>Japanese</item>
        <item>Korean</item>
    </string-array>

</resources>

Java Code Java代码

//Event Handler for the language spinner
    private class LanguageSpinnerHandler implements OnItemSelectedListener
    {
        int result = 0;;

        @Override
        public void onItemSelected(AdapterView<?> parent, View arg1, int position,
                long arg3) {
            // TODO Auto-generated method stub

            if(parent.getItemAtPosition(position).toString()=="English")
            {
                result = tts.setLanguage(Locale.UK);
            }
            else if(parent.getItemAtPosition(position).toString()=="Chinese")
            {
                result = tts.setLanguage(Locale.CHINESE);
            }
            else if(parent.getItemAtPosition(position).toString()=="French")
            {
                result = tts.setLanguage(Locale.FRENCH);
            }
            else if(parent.getItemAtPosition(position).toString()=="Germany")
            {
                result = tts.setLanguage(Locale.GERMANY);
            }
            else if(parent.getItemAtPosition(position).toString()=="Italian")
            {
                result = tts.setLanguage(Locale.ITALIAN);
            }
            else if(parent.getItemAtPosition(position).toString()=="Japanese")
            {
                result = tts.setLanguage(Locale.JAPANESE);
            }
            else
            {
                result = tts.setLanguage(Locale.KOREAN);
            }


            if(result==TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
            {
                Toast.makeText(Talk.this, "This Language is Not Supported in Your Device", Toast.LENGTH_LONG).show();
                tts.setLanguage(Locale.UK);
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

    }

//show settings
    private void showSettings()
    {
        final Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.talk_settings);
        dialog.setTitle("Settings");
        dialog.setCancelable(true);

        SeekBar pitchBar = (SeekBar)dialog.findViewById(R.id.pitchBar);
        SeekBar speakingSpeedBar = (SeekBar)dialog.findViewById(R.id.speedBar);

        pitchBar.setProgress((int) pitchValue);
        speakingSpeedBar.setProgress((int)speakingSpeedValue);

        pitchBar.setOnSeekBarChangeListener(new PicthBarEvent());
        speakingSpeedBar.setOnSeekBarChangeListener(new SpeakingSpeedBarEvent());

        Spinner languageSpinner = (Spinner)findViewById(R.id.language_spinner);
        languageSpinner.setOnItemSelectedListener(new LanguageSpinnerHandler());


        dialog.show();
    }

I am getting a NullPointerException right in here 我在这里得到一个NullPointerException

languageSpinner.setOnItemSelectedListener(new LanguageSpinnerHandler());

Where I went wrong? 我哪里出问题了?

languageSpinner belongs to talk_settings.xml , so you have to look for it inside the dialog view languageSpinner属于talk_settings.xml ,因此您必须在dialog视图中寻找它

Spinner languageSpinner = (Spinner)dialog.findViewById(R.id.language_spinner);

also, String comparison in Java should be performed through the equals or equalsIgnoreCase method 另外,Java中的字符串比较应通过equalsequalsIgnoreCase方法执行

Check if languageSpinner is initialized properly. 检查languageSpinner是否正确初始化。

Spinner languageSpinner = (Spinner)dialog.findViewById(R.id.language_spinner);

findViewById looks for aa view in the current inflated layout. findViewById在当前展开的布局中查找视图。 So use the dialog object to initialize spinner 因此,使用对话框对象初始化微调器

and use .equals to compare strings 并使用.equals比较字符串

parent.getItemAtPosition(position).toString().equals("English")

Try usion 试试usion

Spinner languageSpinner = (Spinner)dialog.findViewById(R.id.language_spinner);

instead of 代替

Spinner languageSpinner = (Spinner)findViewById(R.id.language_spinner); .

As your spinner is in the talk_settings XML you will need to find the Spinner id in the view in which the XML is inflated. 由于您的微调器位于talk_settings XML中,因此您需要在XML被放大的视图中找到Spinner id。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM