2016-02-01 2 views
0

Я пытаюсь создать приложение, которое должно использовать ListActivity и заполнить список с закладками, которые пользователь может добавить.Почему мои результаты не добавляются в первый раз?

Опция «Добавить закладку» указана в меню приложения, и при ее выборе она вызывает функции «показать диалог», которые заставляют пользователя заполнять 3 строковые переменные (заголовок, URL и примечание).

После получения ввода я хочу, чтобы он вызывал addBookmark(), который добавит строки к объекту класса Bookmark, а затем добавит объект в список через ArrayAdapter.

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

import android.app.AlertDialog; 
import android.app.ListActivity; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.text.InputType; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 

import java.util.ArrayList; 


public class BookNote extends ListActivity{ 

private ArrayAdapter<Bookmark> adapter; 
private String title = "Example Title",url = "www.ExampleURL.com",note = "Example Note about Website"; 

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

    ArrayList<Bookmark> bookmarkList = new ArrayList<>(); 
    adapter = new ArrayAdapter<Bookmark>(this,android.R.layout.simple_list_item_1,bookmarkList); 
    setListAdapter(adapter); 
} 

//Show dialog and editText for user to assign title to bookmark. 
public void showTitleDialog(){ 
    AlertDialog.Builder titleBuilder = new AlertDialog.Builder(this); 
    titleBuilder.setTitle("Enter Title"); 

    final EditText titleET = new EditText(this); 
    titleET.setInputType(InputType.TYPE_TEXT_VARIATION_NORMAL); 
    titleBuilder.setView(titleET); 
    titleBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int i) { 
      title = titleET.getText().toString(); 
     } 
    }); 
    titleBuilder.show(); 
} 

//Show dialog and editText for user to assign url to bookmark. 
public void showURLDialog(){ 
    AlertDialog.Builder urlBuilder = new AlertDialog.Builder(this); 
    urlBuilder.setTitle("Enter URL"); 

    final EditText urlET = new EditText(this); 
    urlET.setInputType(InputType.TYPE_TEXT_VARIATION_NORMAL); 
    urlBuilder.setView(urlET); 

    urlBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int i) { 
      url = urlET.getText().toString(); 
     } 
    }); 
    urlBuilder.show(); 
} 

//Show dialog and editText for user to assign note to bookmark. 
public void showNoteDialog(){ 
    AlertDialog.Builder noteBuilder = new AlertDialog.Builder(this); 
    noteBuilder.setTitle("Enter Note"); 

    final EditText noteET = new EditText(this); 
    noteET.setInputType(InputType.TYPE_TEXT_VARIATION_NORMAL); 
    noteBuilder.setView(noteET); 

    noteBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      note = noteET.getText().toString(); 
     } 
    }); 

    noteBuilder.show(); 
} 

//Create new bookmark object filled with user entries and add to ArrayAdapter. 
private void addBookmark(){ 
    Bookmark bookmark = new Bookmark(title,url,note); 
    adapter.add(bookmark); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_book_note, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_add) { 
     showTitleDialog(); 
     showURLDialog(); 
     showNoteDialog(); 
     addBookmark(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

ответ

0

Я считаю, что то, что происходит в том, что ваш метод opOptionsItemSelected() выполняет следующие строки кода:

//noinspection SimplifiableIfStatement 
if (id == R.id.action_add) { 
    showTitleDialog(); 
    showURLDialog(); 
    showNoteDialog(); 
    addBookmark(); 
    return true; 
} 

Вы, кажется, ожидать, что приложение будет ждать, пока после того, как диалоговые окна уволен, прежде чем перейти на метод . Это не так. Приложение отобразит каждое диалоговое окно, а затем немедленно выполнит команду .

У вас есть onClick слушатели, определенные в каждом из ваших диалогов. Вы должны разместить свой метод в одном из них, чтобы он выполнял после. Пользователь ввел свою информацию.

Я также предложил бы сделать его одним диалогом. Три диалога могут раздражать. Что произойдет, если пользователь отменит во время первого или второго диалога?

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