簡體   English   中英

getView的DialogFragment在onDismiss上返回null

[英]getView's DialogFragment returning null on onDismiss

我有一個從DialogFragment派生的自定義對話框。

當用戶單擊確定按鈕時,我需要保存屏幕上的信息。

所以我使我的PositiveButton調用dismiss並且我實現了onDismiss方法來保存數據。

在onDismiss方法中,我需要從Dialog上的editView獲取數據。 我正在使用getView()。findViewByID來獲取editView,但方法GetView()返回null。

這是我的代碼:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
           .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().dismiss();
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().cancel();
               }
           });      
    return builder.create();
}

@override
public void onDismiss(){
    EditView view = (EditView)getView().findViewByID(R.id.edit);
}

我知道我可以將OnCreateDialog中膨脹的視圖保存為屬性,但這對我來說似乎不對。

如何在onDismiss中從屏幕上獲取視圖的正確方法?

Ps:我工作的地方不允許我發布我的代碼,所以我從谷歌中獲取了代碼並將其更改為盡可能接近我的代碼。

我登錄DialogFragment是通過對片段的父活動使用回調方法,如下所示:

builder.setPositiveButton("Login", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                EditText username = (EditText) getDialog().findViewById(R.id.username);
                EditText password = (EditText) getDialog().findViewById(R.id.password);                 

                un = username.getText().toString();
                pw = password.getText().toString();

                    if (un.equals("") || pw.equals("")) {
                        Toast.makeText(getActivity(), "Username or Password field was empty", Toast.LENGTH_SHORT).show();
                        //Don't login & do something (I made a recursive callback to the fragment that created the dialog)
                    }
                    else if (!un.equals("username") || !pw.equals("password")) {
                        Toast.makeText(getActivity(), "Username or Password was incorrect", Toast.LENGTH_SHORT).show();
                        //Don't login & do something (I made a recursive callback to the fragment that created the dialog)
                    }
                    else if (un.equals("username") && pw.equals("password")) {
                        Toast.makeText(getActivity(), "You have logged in successfully", Toast.LENGTH_SHORT).show();
                        mLogin.Login();
                    }

然后回調方法Login()將創建所需的下一個片段。

將創建登錄對話框的片段在其回調方法中將包含以下代碼:

LoginDialog login = new LoginDialog();
login.show(getFragmentManager(), "LOGIN");

老但金。 這個允許對整個片段進行更大的控制(例如,在實現seekBar或使用ButterKnife時)。 說夠了:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    View view = inflater.inflate(R.layout.dialog_signin, null);
    // do your stuff with views here

    builder.setView(view)
       .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               LoginDialogFragment.this.getDialog().dismiss();
           }
       })
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               LoginDialogFragment.this.getDialog().cancel();
           }
       });      
    return builder.create();
}

我知道我可以將OnCreateDialog中膨脹的視圖保存為屬性,但這對我來說似乎不對。

是的,就是那個。 它看起來是正確的,尤其是在實現諸如seekBar之類的東西以及使用像ButterKnife這樣的庫時。

暫無
暫無

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

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