3

私のプロジェクトの目標は、ログイン ID を保存することです。また、ログイン ID が既に保存されている場合は、ユーザーがログイン ID を入力すると、オートコンプリートする必要があります。

入力した値を SQLite DB に保存し、そこから読み込んでオートコンプリート テキスト ビューに入力しようとしています。私が直面している問題は、サインインボタンをクリックする前または後に入力したテキストを読み取ろうとすると、文字列が常に "" (空) になることです。これが常に空である理由がわかりません。onCreate () と loginOnClick(View v) で文字列を読み取ろうとしました。どちらの場所でも空の文字列が得られます。コードは次のとおりです。

public class LoginActivity extends Activity {

    private LoginInfoSQLiteOpenHelper loginInfoSQLiteHelper;
    private SQLiteDatabase database;
    private String userId;
    private String passwd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        //TEST ONLY
        deleteDatabase(DB_NAME);   // For testing purposes - Delete DB for a clean start

        loginInfoSQLiteHelper  = new LoginInfoSQLiteOpenHelper(LoginActivity.this);
        database = loginInfoSQLiteHelper.getWritableDatabase();

        persistLoginId("Champ");
        persistLoginId("Cambodia");
        persistLoginId("Canada");
        persistLoginId("Champ");

        String [] userNames = getAllUserNames();

        for(String str: userNames){
            Toast.makeText(this,  str, Toast.LENGTH_SHORT).show();
        }

        AutoCompleteTextView loginId = (AutoCompleteTextView) findViewById(R.id.id_text);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, userNames);
        loginId.setAdapter(adapter);
        userId = loginId.getEditableText().toString(); //always empty

        EditText password = (EditText) findViewById(R.id.password_text);

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();              

        finish();
    }

    public void loginOnClick(View v) {
        persistLoginId("Canada");
        persistLoginId(userId);
//userID = "" empty

        //Toast.makeText(this, "Sign In Button works " , Toast.LENGTH_LONG).show();

    }

    public String[] getAllUserNames(){

    Cursor cursor = database.query(DB_TABLE_NAME,new String[]{DB_COLUMN_1_NAME},null,
                null,null,null,null);

        String[] str = new String[cursor.getCount()];
        int i = 0;

        cursor.moveToFirst();

        if(!cursor.isAfterLast()){
            do{
                String name = cursor.getString(cursor.getColumnIndex(DB_COLUMN_1_NAME));
                str[i] = name;
                i++;
            }while(cursor.moveToNext());
            cursor.close();
            return str;         
        }
        else{
            cursor.close();         
            return new String[]{};
        }

    }

    private void persistLoginId(String loginId) {

            //Check if loginID exists then do not add
            if ( !loginIdExists(loginId)){
                ContentValues contentValues = new ContentValues();
                contentValues.put(DB_COLUMN_1_NAME, loginId);
                Log.i(this.toString() + " insertUserName", "Inserting username : " + loginId);
                database.insert(DB_TABLE_NAME, null, contentValues);
            } else{
                //for testing 
                Toast.makeText(this, loginId + "  exists. Not Added", Toast.LENGTH_LONG).show();
            }

    }

    public boolean loginIdExists(String id) {
        String DB_SELECT_SCRIPT = "SELECT " + DB_COLUMN_1_NAME + " FROM " + DB_TABLE_NAME ;
        SQLiteDatabase db = loginInfoSQLiteHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery(DB_SELECT_SCRIPT, null);

        if( cursor != null){
            cursor.moveToFirst();
            if(!cursor.isAfterLast()){
                do{
                    String name = cursor.getString(cursor.getColumnIndex(DB_COLUMN_1_NAME));
                    if(id.equals(name)){
                        cursor.close();
                        return true;
                    }
                }while(cursor.moveToNext());        
            }
            else{
                cursor.close();         
                return false;
            }
        }
        return false;       
    }

    public boolean removeUserName(String userName){
        int result = database.delete(DB_TABLE_NAME, "user_name='" + userName + "'", null);

        if(result > 0)
            return true;
        else
            return false;
    }

}
4

2 に答える 2

1

getEditableText()Editableではなくオブジェクトを返しますString。ご希望の方法はgetText()

ソース: http://developer.android.com/reference/android/widget/EditText.html

于 2011-06-26T02:51:06.807 に答える
1

getText() から空の文字列が返される問題を修正しました。onCreate() で AutoCompleteTextView loginId を宣言する軽微なエラーでした。loginID は onCreate() が実行されるとスコープを失うため、loginOnClick() で入力された文字列を読み取ろうとすると、空として読み取られます。これを修正するために私がしたことは次のとおりです。

  1. アクティビティのプライベート メンバーとして宣言された AutoCompleteTextView loginId -

    private AutoCompleteTextView loginId;
    
  2. onCreate() を次のように変更しました -

    loginId = (AutoCompleteTextView) findViewById(R.id.id_text);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, userNames);
    loginId.setAdapter(adapter);
    
  3. loginOnClick(View v) を次のように変更

    public void loginOnClick(View v) {
        String userId = loginId.getText().toString();
        EditText password = (EditText) findViewById(R.id.password_text);
        String passwd = password.getText().toString();
                persistLoginId(userId);
    }   
    
于 2011-06-27T17:36:54.987 に答える