Рябята, помогите.
Что-то у меня совершенный затык на ровном месте образовался.
Язык — Java.
Есть класс.
В нём функция типа string.
В ней функция типа void.
В ней переменная типа string.
как передать эту переменную в родительскую функцию?

инсайде реальный пример.
помогите пожалуйста: ночью плохо сплю, не могу понять в чём проблема.

Tagged with →  

22 Responses to Java не могу понять в чём проблема

  1. URL:

    Есть функция «спросить у пользователя вопрос». Она строит диалог и показывает пользователю вопрос вида «Как дела?» и поле для вода.
    Есть обработчик onclick(), который ничего не возвращает и возвращать не может, но по клику на кнопку нужно вернуть родительской функции значение поля ввода
    public string AskQuestion {
    //строим диалог, кидаем ему кнопки
    buttonOk.onclick() {
    String result = (String) Answer.GetContents.ToString();
    }
    return result
    }
    примерно как-то так.
    так вот, как бы передать результат из OnClick наверх в AskQuestion

  2. Xuawhite:

    оно же будет АСИНХРОННО!

  3. URL:

    на каком этапе объявить result?
    1) если result объявить в классе, то это получится какой-то говнокод, ибо творить глобальную переменную для использования внутри пары функций — грех.
    2) если в теле функции AskQuestion, то из OnClick нет доступа к этой переменной (по крайней мере на запись)
    3) если в OnClick, то переменная умрёт сразу после обработки OnClick не дожив до AskQuestion.
    Но я явно что-то делаю не так. Сейчас оно у меня костылировано первым методом, но хочется узнать как правильно.

  4. Rohed:

    buttonOk.onclick() {…} — это не java.

  5. HTnsuper:

    а javascript — не типизированный.

  6. Mookey:

    во первых: у тебя вызов обработчика будет асинхронным
    а во вторых: сделай внутри первой функции объект и из внутреностей второй функции проапдейти поле этого объекта?

  7. URL:

    написано по памяти для демонстрации. я ещё довольно плохо знаю язык, чтобы по памяти писать сразу правильно.

  8. URL:

    1) не столь существенно в данный момент
    2) спасибо за идею, попробую как доберусь до кода

  9. EmeNo:

    нужно больше контекста.
    допустим в Swing это будет выглядеть так (с потоками здесь не очень корректно, но в общем работать будет):
    public class PoliteConversation{

    public void askHowDoYouDo(){

    button.addListener(new Listener() {
    public void onClick() {
    heAnswered(textArea.getText());
    }
    });

    }
    public void heAnswered(String text){
    //продолжение разговора
    }
    }
    в том же Swing есть способ синхронно задать вопрос:
    туториал здесь
    Просто обновить свойства общего объекта не выйдет из за того что слушатель вызывается асинхронно, и остаток метода не будет ждать (если не попросить, а это ещё парочку упражнений с java.util.concurrent)

    Для консоли можно проще.

  10. URL:

    в туториале предлагается таки переменная уровня класса.

    вопрос в том, что не public void askHowDoYouDo(), а public string askHowDoYouDo(){? которая в итоге должна принять значение ответа.

  11. URL:

    сейчас код такой:

    public class PromptDialodue extends Activity {

    private static String result;

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

    }

    public String ShowDialogue (String title, String hint) {
    final Context context = this;
    LayoutInflater li = LayoutInflater.from(context);
    View promptsView = li.inflate(.layout.prompt, null);
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

    alertDialogBuilder.setView(promptsView);

    final EditText userInput = (EditText) promptsView.findViewById(.id.editTextDi alogUserInput);
    userInput.setHint(hint);

    alertDialogBuilder.setCancelable(true).s etPositiveButton(«OK»,
    new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog,int id) {
    result = userInput.getText().toString();
    }
    }).setNegativeButton(«Cancel»,
    new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog,int id) {
    dialog.cancel();
    }
    }).setTitle(title);

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
    return result;
    }

    }

  12. Ele-Ele:

    Привет
    Если я правильно разобрал это форматирование в твоем примере, то ты хочешь чтобы result из onClick, попал в ShowDialogue?
    Если так, то в этом нет смысла. Т.к. программа выйдет из метода ShowDialogue, еще до того как сработает OnClick, т.е. как уже сказали создание диалога, будет произведена асинхронно, т.е. на show() оно висеть не будет.
    Ты наверно раньше кодировал на каком-нибудь MFC или т.п. так вот, там можно было создавать много UI потоков, точнее даже не было разницы UI это поток или нет. В Android’е и считай теперь почти везде UI поток всегда ОДИН, т.е. если бы он висел на ожидании нажатия кнопки в твоем диалоге, то ВСЕ приложение, все его ui-компоненты зависли бы, т.е. ты даже бы не смог на них нажать. Поэтому UI элемент (твой диалог) создается, а выполнение идет дальше.

  13. Ele-Ele:

    …про MFС я вспомнил потому что там был DoModal который висел до окончания работы диалога, т.е. после него можно было вернуть какой-нибудь результат полученный от пользователя (то как хочешь сделать ты). В твоем же примере если ShowDialogue сделать void ничего по сути не изменится.

  14. ArbYes:

    startActivityForesult(intent, DialogActivity.class) + onActivityesult() в активити которой нужен результат диалога. Ну и да как правильно пишет товарищ у тебя не модальный диалог.
    PS: ты лучше скажи что ты сделать хочешь, вероятнее всего ты пришел в тупик потому что избрал слегка не тот путь который пропагандируется гуглом на их платформе.

  15. URL:

    я хочу написать простой диалог с пользователем вида вопрос-ответ,
    чтобы в любом куске кода я мог вызвать такую штуку

    String naezd = s.ShowDialogue (‘Курить есть чо?’, ‘Скажи сколько денег ты хочешь мне отдать’)

  16. URL:

    программа выйдет из метода ShowDialogue, еще до того как сработает OnClick
    блин, а ведь точно!

  17. Ele-Ele:

    String naezd = s.ShowDialogue (…) — предполагает синхронность, т.е. ShowDialogue не просто покажет диалог, а еще и дождется ввода пользователя. А если вся эта конструкция выполняется синхронно, то она не может быть выполнена в UI потоке (который один), следовательно должна быть выполнена в отдельном не-ui треде, а оттуда этот naezd еще нужно как-то передать…
    Расскажи всю задачу целиком, что ты хочешь делать с этим naezd, когда спрашиваются вопросы, что происходит дальше, в общем подробностей.
    Но наперед скажу что нужен механизм подписчиков на события, аля onActivityesult, который упомянул .

  18. URL:

    да, с событиями — видимо оно так.

    про переменную — это просто строка введенная пользователем. может быть названием какой-то фигни, может быть комментарием к чему-либо, может быть она потом будет пользователю отправлена в твиттер или будет ставиться статусом в фейсбуке, короче просто тупо строка которую пользователь хочет сказать миру, где мир зависит от контекста String alcomessage = s.ShowDialogue (‘Что хочешь сказать в алкопосте?’, ‘Чуваки! Пойдём бухать!’), String alarmshout = s.ShowDialogue (‘Какой фразой тебя разбудить?’, ‘Вставай скотина, ты всё проспал!’). То есть универсальный диалог запроса от пользователя произвольной строки, которому ты передаешь вопрос пользователю и подсказку (если хочешь). а от него получаешь ответ в виде переменной String.

  19. Ele-Ele:

    А откуда берутся вопросы?

  20. Mookey:

    именно это тебе пытались сказать словами про асинхронность обработчиков 😉

  21. URL:

    В коде в зависимости от контекста.
    Если пользователь выбрал разбуди меня с восходом солнца, то ставится будильник и от пользователя нужно узнать только String alarmshout = s.ShowDialogue (‘Какой фразой тебя разбудить?’, ‘Вставай скотина, ты всё проспал!’)
    Если пользователь хочет выпить — ему нужно написать в алкопост. Тогда основным вопросом будет что же им такого сказать: String alcomessage = s.ShowDialogue (‘Что хочешь сказать в алкопосте?’, ‘Чуваки! Пойдём бухать!’)
    Ну то есть если мне вдруг в коде потребуется мнение пользователя насчет дальнейших действия — я его спрошу.
    Наверняка будет другая функция типа boolean yesNo (String question) {}, чтобы использовать в закрытых вопросах вроде boolean thirsty = s.yesNo (‘Пить хочешь?’)

  22. Rehodin:

    я так понимаю что тут требуется использовать анонимный класс, в кратце примерно так:

    public abstract class StringBackHandler {
    public abstract void execute(String value);
    }

    При создании диалога надо передать в форму этот хендлер и установить его вызов в требуемом событии
    так мы передаём наш хендлер:
    object.setOnClick(new StringBackHandler() {
    @Override
    public void execute(final String result) {
    //обработка результата
    }
    });

    public setOnClick(StringBackHandler handler){
    //
    this.hadler = handler;
    }

    //вызов при событии
    private onClick(){
    if(this.handler!=null){
    handler.execute(dataToPass);
    }
    }

Добавить комментарий