2

スピナーを含むアプリを構築しています。スピナーは、デバイス上のデータベースからのデータを保持する ArrayAdapter から取り込まれます。問題は、アプリを起動するたびに、何も表示せずにすぐにクラッシュすることです。使用する前はすべて問題なかったので、これは Spinner の問題であると確信しています。

LogCat:

11-30 12:56:23.660: E/AndroidRuntime(3945): FATAL EXCEPTION: main
11-30 12:56:23.660: E/AndroidRuntime(3945): java.lang.NullPointerException
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.View.measure(View.java:8313)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.View.measure(View.java:8313)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.View.measure(View.java:8313)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.View.measure(View.java:8313)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.os.Looper.loop(Looper.java:130)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at android.app.ActivityThread.main(ActivityThread.java:3683)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at java.lang.reflect.Method.invokeNative(Native Method)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at java.lang.reflect.Method.invoke(Method.java:507)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-30 12:56:23.660: E/AndroidRuntime(3945):     at dalvik.system.NativeStart.main(Native Method)

私のコード(スピナーを保持するアクティビティ):

public class UserActivity extends Activity{

    private Spinner profiles;

    private String[] arrayspinner = new String[100];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        this.setContentView(R.layout.profiles);

        Button Submit = (Button) findViewById(R.id.SubmitProfile);

        final EditText profileName = (EditText) findViewById(R.id.ProfileName);

        profileName.setText("");

        this.profiles = (Spinner) findViewById(R.id.spinner1);


        SetSql sqler = new SetSql(UserActivity.this);
        sqler.open();
        arrayspinner = sqler.getProfiles(); 
        sqler.close();

        if(arrayspinner==null){
            arrayspinner[0] = "No Profiles, Please Create One";
        }

        @SuppressWarnings({ "rawtypes", "unchecked" })
        ArrayAdapter array = new ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayspinner);
        profiles.setAdapter(array);

        //I am using the post method to make sure that this spinner wont run when the activity is started
        profiles.post(new Runnable(){
            public void run(){
                profiles.setOnItemSelectedListener(new OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {
                        // TODO Auto-generated method stub
                            if(!arrayspinner[arg2].equals("No Profiles, Please Create One")){
                                String selected = arrayspinner[arg2];
                                Intent intent = new Intent(UserActivity.this, DPAActivity.class);
                                intent.putExtra("username", selected);
                                startActivity(intent);
                            }
                    }

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

                    }
                });
            }

        });

        //the button listener
        Submit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String name = profileName.getText().toString();
                if(name.equals("")){
                    profileName.setHint("Please Enter Some Data Here");
                }else{
                    SetSql sqlobj = new SetSql(UserActivity.this);
                    //open a DB connection
                    sqlobj.open();
                    String[] profiledata2 = new String[100];
                    profiledata2 = sqlobj.getProfiles();
                    //setup a boolean to check if the profile name matches with one from the database
                    boolean isSame = false;
                    //run the check
                    if(profiledata2!=null){
                        for(int x=0; x<profiledata2.length; x++){
                            if(profiledata2[x].equals(name)){
                                isSame=true;
                            }
                        }
                    }
                    //use the isSame variable!
                    if(isSame){
                        profileName.setHint("This profile name is already in use!");
                        //close connection
                        sqlobj.close();
                    }else{
                        //insert profile into DB
                        sqlobj.createProfile(name);
                        //close connection
                        sqlobj.close();

                        //setup intent and move to the next activity
                        Intent intent = new Intent(UserActivity.this, DPAActivity.class);
                        intent.putExtra("username", name);
                        startActivity(intent);
                    }
                }
            }
        });
    }
}

ご覧のとおり、私のコードには、データが空の場合に備えて配列にデータを入れるオプションもあるため、null はありません (希望)。

私のXML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Select your profile, Or create a new one!"
    android:textSize="25dp" />

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="30dp"
    android:text="New profile:"
    android:textSize="20dp" />

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <EditText
        android:id="@+id/ProfileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10"
        android:hint="Profile name..." >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/SubmitProfile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Create!" />

</LinearLayout>

</LinearLayout>

編集

だから私はあなたが提案したように私の配列が空ではないことを確認しましたが、それでも同じエラーでクラッシュします。何か助けはありますか?

4

5 に答える 5

0

私はこれがクラッシュしているラインであるとかなり確信しています:

    if(arrayspinner==null){
        arrayspinner[0] = "No Profiles, Please Create One";
    }

基本的に、nullにするか、何も指さないようにします。ここで設定し、前の宣言を削除するだけです。

    if(arrayspinner==null){
        arrayspinner = new String[100];
        arrayspinner[0] = "No Profiles, Please Create One";
    }
于 2012-11-30T11:50:00.960 に答える
0

SetSql() とは?

次の行で何が null かをデバッグして確認する必要があります。

ArrayAdapter 配列 = 新しい ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayspinner);

おそらく 「arrayspinner」です

データベース クエリからスピナーを設定する場合は、ArrayAdapter ではなく、CursorAdapter を介して選択肢を提供する必要があります。

于 2012-12-03T11:23:41.653 に答える
0

arraySpinner[0] のみにデータが含まれているため、arraySpinner には null-Data が含まれていますが、arrayspinner[1] から arrayspinner[99] には null データが含まれています。すべてのデータの長さの配列を作成し、その配列を arrayadapter に渡す必要があります。このようなもの:

int count = 0;
for(int i = 0; i < arrayspinner.length; i++)
{
    if(arrayspinner[i] != null)
    {
        count++;
    }
}
String[] replaceArray = new String[count];
int counter = 0;
for(int k = 0; k < arrayspinner.length; k++)
{
    if(arrayspinner[k] != null)
    {
        replaceArray[counter++] = arrayspinner[k];
    }
}
ArrayAdapter<String> array = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, replaceArray);

または、arrayspinner[1] を arrayspinner[99] に空の文字列 "" に設定できます。これにより、スピナーに 99 行の空行が表示されます。

于 2013-05-15T05:49:58.383 に答える
0

ええ、最初に初期化した場合、Arrayspinner は null ではありません。

private String[] arrayspinner = new String[100];

それはただ空であるため、そのままです。

于 2012-11-30T12:14:19.660 に答える
0

以下のコードの android.R.layout.simple_spinner_item はレイアウト ID です。

    ArrayAdapter array = new ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayspinner);
    profiles.setAdapter(array);

ここでのコンストラクタは publicArrayAdapter (Context context, int textViewResourceId, T[] objects)です。正しいコンストラクターを使用してください。これを参照してください。

于 2012-11-30T11:57:56.440 に答える