簡體   English   中英

為什么不第一次添加我的結果?

[英]Why aren't my results being added the first time?

我正在嘗試制作一個必須使用ListActivity的應用程序,並使用用戶可以添加的書簽填充列表。

應用程序菜單中列出了“添加書簽”選項,選中該選項后,它會調用3個“顯示對話框”功能,提示用戶填寫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);
}
}

我相信發生的事情是您的opOptionsItemSelected()方法正在執行以下代碼行:

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

您似乎希望應用程序會等到對話框addBookmark()后再移至addBookmark()方法。 不會的 該應用程序將顯示每個對話框,然后立即執行addBookmark()

您在每個對話框中都定義了onClick偵聽器。 您應該將addBookmark()方法放在其中一種方法中,以便在用戶輸入信息執行。

我也建議將其設為一個對話框。 三個對話框可能很煩人。 如果用戶在第一個或第二個對話框中取消操作會怎樣?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM