2015-05-31 3 views
0

У меня есть раскрывающийся список действий в приложении для Android. Когда пользователь щелкает элемент из раскрывающегося списка. Я добавил AlertDialogBuilder, чтобы получить некоторые пользовательские данные от пользователя, если пользователь нажмет ok, он сохранит данные. Когда я запускаю код, я получил это исключение. IMAGE_LOGПолучение java.lang.IllegalStateException в android

это код, я использую

@Override 
public boolean onNavigationItemSelected(final int i, long l) { 


    final ArrayList<Host> hosts = HostFactory.getHosts(this.getApplicationContext()); 

    // get prompts.xml view 
    LayoutInflater li = LayoutInflater.from(this); 
    View promptsView = li.inflate(R.layout.auto_discovery_prompt, null); 

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
      this); 

    // set prompts.xml to alertdialog builder 
    alertDialogBuilder.setView(promptsView); 

    final EditText txtDeviceName = (EditText) promptsView.findViewById(R.id.txtdevicename_editTextDialogUserInput); 
    final EditText txtUsername = (EditText) promptsView.findViewById(R.id.txtusername_editTextDialogUserInput); 
    final EditText txtPassword = (EditText) promptsView.findViewById(R.id.txtpassword_editTextDialogUserInput); 
    final EditText txtPort = (EditText) promptsView.findViewById(R.id.txtport_editTextDialogUserInput); 
    String mac=navSpinner.get(i).getMacaddress(); 

    txtDeviceName.setText(navSpinner.get(i).getTitle()); 
    txtPort.setText(navSpinner.get(i).getPort()); 
    for(SpinnerNavItem items:navSpinner) 
    { 
     if(items.getTitle().toString()!="Select your Device") 
     { 

      // set dialog message 
      alertDialogBuilder 
        .setCancelable(false) 
        .setPositiveButton("OK", 
          new DialogInterface.OnClickListener() { 
           @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
           public void onClick(DialogInterface dialog, 
                int id) { 
            // get user input and set it to result 
            // edit text 
            //result.setText(userInput.getText()); 

            String dd=txtPassword.getText().toString(); 


            Host savecurrent_selected_host =new Host(); 

            savecurrent_selected_host.name=txtDeviceName.getText().toString(); 
            savecurrent_selected_host.addr=navSpinner.get(i).getIPaddress().toString(); 

            try { 
             savecurrent_selected_host.port = Integer.parseInt(txtPort.getText().toString()); 
            } catch (NumberFormatException e) { 
             savecurrent_selected_host.port = Host.DEFAULT_HTTP_PORT; 
            } 

            savecurrent_selected_host.user=txtUsername.getText().toString(); 
            savecurrent_selected_host.pass=txtPassword.getText().toString(); 

            savecurrent_selected_host.esPort = Host.DEFAULT_EVENTSERVER_PORT; 
            savecurrent_selected_host.timeout = Host.DEFAULT_TIMEOUT; 
            savecurrent_selected_host.access_point=""; 
            if(!(navSpinner.isEmpty()&& navSpinner.get(i).getMacaddress().toString().isEmpty())) 
             savecurrent_selected_host.mac_addr=navSpinner.get(i).getMacaddress().toString(); 
            else 
             savecurrent_selected_host.mac_addr=""; 
            savecurrent_selected_host.wol_port = Host.DEFAULT_WOL_PORT; 
            savecurrent_selected_host.wol_wait = Host.DEFAULT_WOL_WAIT; 

            HostFactory.addHost(getApplicationContext(), savecurrent_selected_host); 
            HostFactory.saveHost(getApplicationContext(),savecurrent_selected_host); 

           } 
          }) 
        .setNegativeButton("Cancel", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
                int id) { 
            dialog.cancel(); 

           } 
          }); 

      // create alert dialog 
      alertDialog = alertDialogBuilder.create(); 

      // show it 
      if(!alertDialog.isShowing()) 
       alertDialog.show(); 

    } 
} 

Как я могу исправить эту проблему? (Приложение торможение, когда приходят к alertDialog.show())

+0

Что делать, если вы попробуете предложение из сообщения об ошибке? Добавьте 'removeView' перед' setView' в диалоговом окне. –

ответ

1

Я считаю, что у вас есть две проблемы с вашим кодом , и первая проблема вызывает вторую. Первая проблема заключается в том, что вы показываете новый alertDialog для каждого элемента в navSpinner. Следующий if заявления

if(items.getTitle().toString()!="Select your Device") 

всегда будет true, потому что вы делаете ссылочное сравнение (==). Вы хотите использовать .equals(). (См. here для лучшего объяснения).

if(!items.getTitle().toString().equals("Select your Device")) 

Даже это кажется немного подозрительным, как вы, вероятно, хотите, чтобы сравнить элемент контура для выбранного элемента, а не строки некоторые по умолчанию. В любом случае, в результате, вы создаете новый alertDialog для каждой итерации цикла

alertDialog = alertDialogBuilder.create(); 

create() возвращает новый диалог каждый раз, так что следующая проверка

if(!alertDialog.isShowing()) 

всегда true, как новый диалог, который был создан одной строкой выше, очевидно, пока не показан. Означает новый alertDialog всегда отображается

alertDialog.show(); 

На первый взгляд, можно было бы ожидать, что это приведет к нескольким диалогам оповещения показываются, один для каждого элемента в петле. Однако это не так, поскольку второй диалог предупреждения, который будет создан во время второй итерации цикла, вызовет IllegalStateException. Зачем? Из-за этого:

alertDialogBuilder.setView(promptsView); 

Хотя ваш второй диалог действительно является его собственный диалог, он разделяет promptsView с диалога, который был создан во время первой итерации цикла. Когда вызывается show(), задан родительский адрес promptsView. Это нормально, когда отображается первое диалоговое окно, потому что promptsView - это новый вид без назначенного родителя. Однако, когда второе диалоговое окно отображается - из второй итерации цикла - метод show() пытается дать родительскому элементу promptsView, но на этот раз он терпит неудачу, потому что ему уже предоставлен родительский элемент из первого диалога show(). И, таким образом, ошибка: У указанного ребенка уже есть родительский

Короче говоря, исправьте свою петлю так, чтобы отображалось только одно диалоговое окно, и вам должно быть хорошо идти.

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