2012-05-25 2 views
1

Я работаю над приложением, которое, когда вы идете на экран, вы выбираете свое местоположение из диалогового окна, созданного в пределах onCreate. После выбора местоположения он записывает его в предсказанный TextView. Проблема, с которой я сталкиваюсь, - это когда ориентация экрана меняет ее, она воссоздает диалог, и я пытаюсь не запускать функцию диалога.Не запускать функцию onRestoreInstanceState

Вот основные сведения о том, что у меня есть в файле класса.

@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() это попробовали несколько сценариев, чтобы проверить длину строки, будь то нуль или нет. Когда экран меняется, он показывает исходное выбранное местоположение, но все же запускает диалог.

ответ

2

Вы всегда вызывать метод setLocation, потому что каждый раз, когда onCreate метод Activity называется form_location.getText().equals("") будет true (потому что TextView воссоздано (и, скорее всего, вы не установили текст на нем в файле макета)).

Чтобы избежать этого, используйте savedInstanceState метода onCreate:

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")); 
} 
+0

Спасибо, @Luksprog и Рац оба ответа были очень полезны, и оба были в состоянии сделать это. Я даже читал об этом месяц назад, но просто не мог вспомнить. – Bobby

1

Вы можете установить в файле манифеста в теге действия атрибут configchange. Если вы установите. Ориентация флага, чем ваша деятельность, не будет уничтожена при каждом изменении ориентации. Так что один раз будет вызван один раз.

Смежные вопросы