1

私はJava/Androidが初めてなので、これらの用語の多くは外国語ですが、喜んで学びます. アプリとは関係ないと思うので詳細は割愛します。私の問題は現状では、ブログのチュートリアルとコードを使用して、コードを機能させることができました。コードをクリーンアップして整理しようとすると、1 行移動すると (autocompletetextview を作成すると) nullpoiner 例外が発生します。以下は私が使用したコードです。問題を引き起こしている私の1行のコードは

AutoCompleteTextView companyAutoComplete = (AutoCompleteTextView) addAddressDialog.findViewById(R.id.add_record_dialog_autocomplete);

関数の開始点のすぐ下に移動するとエラーになりますが、そのままにしておくと魅力的に機能します。これがなぜなのかを理解したいと思います。

public void addAddress() {
    final Dialog addAddressDialog = new Dialog(this);
    final int[] to = new int[] { android.R.id.text1 };
    final String[] from = new String[] { "CompanyName" };

    // Create a SimpleCursorAdapter for the CompanyName field.
    SimpleCursorAdapter adapter =  new SimpleCursorAdapter(this, android.R.layout. select_dialog_item, null, from, to);

    addAddressDialog.setContentView(R.layout.add_record_dialog);
    addAddressDialog.setTitle(getString(R.string.add_record_dialog_address_title));
    addAddressDialog.setCancelable(true);

    final EditText text1 = (EditText) addAddressDialog.findViewById(R.id.add_record_dialog_edittext);
    text1.setHint(getString(R.string.add_record_dialog_company_hint));

    Button buttonOK1 = (Button) addAddressDialog.findViewById(R.id.add_record_dialog_ok);
    buttonOK1.setText(getString(R.string.add_record_dialog_ok_button));

    Button buttonCancel1 = (Button) addAddressDialog.findViewById(R.id.add_record_dialog_cancel);
    buttonCancel1.setText(getString(R.string.add_record_dialog_cancel_button));

    buttonOK1.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            Bundle addressBundle = new Bundle();
            addressBundle.putString("CompanyName", text1.getText().toString());

            Intent intent = new Intent(MenuActivity.this, AddAddressActivity.class);
            intent.putExtras(addressBundle);
            startActivity(intent);

            addAddressDialog.dismiss();
        }   
    });

    buttonCancel1.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            Toast.makeText(getBaseContext(), "Cancel button clicked", Toast.LENGTH_SHORT).show();
            addAddressDialog.dismiss();
        }   
    });
    AutoCompleteTextView companyAutoComplete = (AutoCompleteTextView) addAddressDialog.findViewById(R.id.add_record_dialog_autocomplete);

    companyAutoComplete.setAdapter(adapter);

    // Set an OnItemClickListener, to update dependent fields when
    // a choice is made in the AutoCompleteTextView.
    companyAutoComplete.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> listView, View view,
                    int position, long id) {
            // Get the cursor, positioned to the corresponding row in the
            // result set
            Cursor cursor = (Cursor) listView.getItemAtPosition(position);

            // Get the CompanyID from this row in the database.
            String companyID = cursor.getString(cursor.getColumnIndexOrThrow("_id"));

            // test to make sure CompanyID returned
            Toast.makeText(getBaseContext(), companyID, Toast.LENGTH_SHORT).show();
        }
    });

    // Set the CursorToStringConverter, to provide the labels for the
    // choices to be displayed in the AutoCompleteTextView.
    adapter.setCursorToStringConverter(new CursorToStringConverter() {
        public String convertToString(android.database.Cursor cursor) {
            // Get the label for this row out of the "CompanyName" column
            final int columnIndex = cursor.getColumnIndexOrThrow("CompanyName");
            final String str = cursor.getString(columnIndex);
            return str;
        }
    });

    // Set the FilterQueryProvider, to run queries for choices
    // that match the specified input.
    adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            Cursor cursorReturn = dbAdapter.getCompanies(constraint != null ? constraint.toString() : null);

            startManagingCursor(cursorReturn);
            return cursorReturn;
        }
        });

    addAddressDialog.show();
}
4

2 に答える 2

2

これは、setContentView後で電話をかけるために発生します。

setContentViewダイアログのレイアウトを設定しますaddAddressDialog。を呼び出さない場合setContentView、レイアウト項目がないため、にaddAddressDialog.findViewById(...);なりnullます。明らかに、それを何にもキャストすることも、呼び出すこともできませんsetHint

このコード行がメソッド内のどこにあるかは問題ではありません。コード行がその前setContentViewに呼び出されている限りは問題ありません。

于 2012-08-01T20:28:21.470 に答える
0

findViewById()重要なのは、呼び出しが への呼び出しの後に呼び出されることだけですsetContentView()。つまり、次の行です。

addAddressDialog.setContentView(R.layout.add_record_dialog); 

XML ファイルadd_record_dialog.xmlは、ID のビューを見つけるためにトラバースするビュー階層ですadd_record_dialog_autocomplete。ダイアログにそのビュー階層を与えるまで、それをトラバースすることはNullPointerExceptionできAutoCompleteTextViewません。

編集:また、メソッドの非常に最初に配置したことを意味する場合addAddressDialog、呼び出しまで null になるため、それも失敗します

final Dialog addAddressDialog = new Dialog(this); 
于 2012-08-01T20:31:20.560 に答える