簡體   English   中英

AlertDialog 中顯示的空 EditText 值

[英]Empty EditText value displayed in AlertDialog

我是 Android 開發的新手,我遇到了問題。 我有 2 個登錄和密碼的EditText字段和 1 個Button 當我單擊Button時,我收到帶有消息“登錄為”的AlertDialog ,但我需要它是“登錄為 *value 輸入到”登錄“ EditText ”。 EditText值始終為空。 這只是一個簡單的實現,但它不起作用。 我在這里做錯了什么?

這是代碼:

public class FirstFragment extends Fragment {
    EditText loginText;
    EditText passwText;
    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {
        View view2 = inflater.inflate(R.layout.fragment_first, null, false);

        loginText = (EditText)view2.findViewById(R.id.loginText);
        passwText = (EditText)view2.findViewById(R.id.passText);
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick( View view) {
                handleLoginDialog();
            }
        });
    }

    private void handleLoginDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        //View view2 = getLayoutInflater().inflate(R.layout.fragment_first, null, false);

        String st = loginText.getText().toString();

        if (loginText != null && passwText != null){
            builder.setMessage("Logged in as " + st);
        }
        else
            builder.setMessage("Login or password was not entered!" );
        builder.show();
    }
}

我想從你所做的開始回答:

您膨脹了 2 個相同的布局:

  1. View view2 = inflater.inflate(R.layout.fragment_first, null, false);
  2. return inflater.inflate(R.layout.fragment_first, container, false);

讓我們將第二次膨脹稱為view1 ,它是為Fragment膨脹的原始視圖,也是onViewCreated()方法中返回的視圖。

然后,為view1onClickListener設置button_first集。

然后,在handleDialogLogin()方法中,您嘗試獲取使用view2 object 創建的EditText字段的文本值。
這就是它出錯的地方 因為,在應用程序使用期間,您在view1EditText字段中插入了文本,但您要求view2EditText字段的文本值顯然是空的。

正確和干凈的方法在這里:

public class FirstFragment extends Fragment {
    EditText loginText;
    EditText passwText;
    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {
        // just inflate the layout for this fragment as it is not correct
        // place for declaring and initializing views
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

    // this is the best place for declaring and initializing views
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // declare and initialize your EditText here 
        loginText = (EditText)view.findViewById(R.id.loginText);
        passwText = (EditText)view.findViewById(R.id.passText);
        view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick( View view) {
                handleLoginDialog();
            }
        });
    }

    private void handleLoginDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());

        String st = loginText.getText().toString().trim();
        String pt = passText.getText().toString().trim();

        if (st.isEmpty() && pt.isEmpty())
           builder.setMessage("Login or password was not entered!" );
        else
           builder.setMessage("Logged in as " + st);
        builder.show();
    }
}

也許你可以試試這個,但這不使用 onViewCreated

public class FirstFragment extends Fragment {
EditText loginText;
EditText passText;
Button btnLogin;
@Override
public View onCreateView(
        LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState
) {
    View view2 = inflater.inflate(R.layout.fragment_first, null, false);

    loginText = (EditText)view2.findViewById(R.id.loginText);
    passText = (EditText)view2.findViewById(R.id.passText);
    btnLogin = (Button) view2.findViewById(R.id.button_first);

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            handleLoginDialog();
        }
    });

    return view2;
}

private void handleLoginDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    //View view2 = getLayoutInflater().inflate(R.layout.fragment_first, null, false);

    String st = loginText.getText().toString().trim();
    String pt = passText.getText().toString().trim();

    if (st.isEmpty() && pt.isEmpty()){
        builder.setMessage("Login or password was not entered!" );
    }
    else
        builder.setMessage("Logged in as " + st);
    builder.show();
}

安全的一面是在handleLoginDialog方法loginText作為字符串參數發送,並在那里檢查字符串是否為空。

暫無
暫無

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

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