2010-09-02 3 views
1

Хорошо, это может быть просто, но я не могу понять, как это сделать. Как я могу изменить эту функцию, чтобы вернуть String class_name? Я знаю, что мне нужно изменить функцию от void до String, но что еще мне нужно сделать?Возвращение через несколько функций

Большое спасибо!

public void addClass() { 
    AlertDialog.Builder alert = new AlertDialog.Builder(this); 

    alert.setTitle("Add Class"); 

    final EditText input = new EditText(this); 
    alert.setView(input); 

    alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      String class_name = input.getText().toString(); 
     } 
    }); 

    alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
     } 
    }); 

    alert.show(); 
} 

ответ

1

Поведение (синхронный диалог), которое вы пытаетесь получить намеренно, не существует в android. Независимо от того, что вы хотите, чтобы щелкнуть кнопку диалога, нужно поместить его в метод OnClickListener.OnClick.

0

Предполагая, что alert.show не возвращается, пока input.getText() не содержит введенное значение, вы можете попробовать:

public void addClass() { 
    final Vector<String> retval = new Vector<String>(); 
    retval.add(""); 

    ... 
    ... 
    alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
      String class_name = input.getText().toString(); 
      retval.set(0,class_name); 
     } 
}); 

... 
... 

    return retval.get(0); 
} 
+0

Это всегда будет возвращать '«»' ', потому что addClass' заканчивается задолго до' OnClick() 'вызывается по кнопке , И после того, как 'addClass' завершился, анонимный класс является единственным классом, содержащим ссылку на Vector, поэтому мы не сможем получить доступ к его содержимому. –

+0

поэтому 'alert.show' не модально? –

0

AlertDialog является асинхронным, и поэтому то, что вы хотите достичь невозможно, через этот код. вы можете установить String class_name как глобальное объявление, а затем инициализировать его до

class_name = input.getText(). ToString();

внутри метода предупреждения onClick.

2

Возврат class_name Значение не помогает. Вы должны реализовать метод обратного вызова, который принимает значение и выполняет необходимые действия:

public void addClass() { 
    AlertDialog.Builder alert = new AlertDialog.Builder(this); 

    // ... 

    alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      setClassName(input.getText().toString()); 
     } 
    }); 

    // ... 
} 

protected void setClassName(String class_name) { 
    // do what ever has to be done with class_name 
} 
Смежные вопросы