1

私は、画面に移動したときに、内に作成されたダイアログから場所を選択するアプリに取り組んでいますonCreate。場所が選択されると、それは事前に設定されたに書き込みますTextView。私が抱えている問題は、画面の向きが変わるとダイアログが再作成され、ダイアログ機能が起動しないようにしようとしていることです。

これが私がクラスファイル内に持っているものの基本です。

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.emergpolice);

    form_location = (TextView) findViewById(R.id.input_location);

    if(form_location == null || form_location.getText().equals("")){
        setLocation();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    outState.putString("LOCATION", (String)form_location.getText());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    form_location.setText(savedInstanceState.getString("LOCATION"));
}

public void setLocation(){
    db = new DatabaseHandler(this);
    db.open();
    final CharSequence[] locOpt = {getString(R.string.dialog_items_current_location),getString(R.string.dialog_items_home),getString(R.string.dialog_items_enter_manually)};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.header_choose_location));
    builder.setSingleChoiceItems(locOpt, -1, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item){
            if(locOpt[item].equals(getString(R.string.dialog_items_home))){
                Cursor cur = db.userInfo(); 
                String address = cur.getString(cur.getColumnIndex("address"));
                String city = cur.getString(7);
                String county = cur.getString(8);
                String state = cur.getString(9);
                String zip = cur.getString(10);
                db.close();
                form_location.setText(address + ", " + city + ", " + county + ", " + state + ", " + zip);
            }
            if(locOpt[item].equals(getString(R.string.dialog_items_current_location))){
                Toast.makeText(getApplicationContext(), locOpt[item], Toast.LENGTH_SHORT).show();
            }
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

そしてTextView私のレイアウトでは

        <TextView
            android:id="@+id/input_location"
            android:layout_width="wrap_content"
            android:layout_below="@+id/text_location"
            android:layout_height="wrap_content"
            android:text="" />

発砲に関する限りsetLocation()、nullかどうかにかかわらず、文字列の長さをチェックするためにいくつかのシナリオを試しました。画面が変わると、元の選択した場所が表示されますが、それでもダイアログが表示されます。

4

2 に答える 2

2

setLocationのメソッドが呼び出されるたびにonCreateメソッドActivityが呼び出されるため、常にメソッドを呼び出しform_location.getText().equals("")ます(が再作成されるtrueためTextView(ほとんどの場合、レイアウトファイルでテキストを設定しないため)。

これを回避するには、次savedInstanceStateonCreateメソッドを使用します。

if (savedInstanceState == null){
   // if savedInstanceState is null the activity is created for the first time
   setLocation();
} else {
   // if not null then the activity is recreated so restore the TextView text
   form_location.setText(savedInstanceState.getString("LOCATION"));
}
于 2012-05-25T20:34:58.997 に答える
1

configchangeの属性をアクティビティタグのマニフェストファイルに設定できます。設定した場合。あなたの活動よりも旗の向きは、向きが変わるたびに破壊されるわけではありません。したがって、onceateは1回だけ呼び出されます。

于 2012-05-25T20:34:11.483 に答える