【问题标题】:Why is my Dialog dismissed before finishing?为什么我的对话框在完成之前被解雇?
【发布时间】:2020-01-05 02:15:33
【问题描述】:

在我的片段中,我想显示一个对话框以在调用另一个函数并移动到另一个活动之前插入一些数据,但是对话框会自动关闭,并且是否调用 dialog.show() 之后的下一行代码我是否完成对话。 这是我的对话框的代码:

package com.technion.doggyguide;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.fragment.app.DialogFragment;

import com.technion.doggyguide.R;


import javax.annotation.Nullable;

public class GoogleSignInDialog extends DialogFragment {
private static final String TAG = "GOOGLE DIALOG";

public interface OnInputListener {
    void sendInput(String dogname, String dogbreed);
}

public OnInputListener mOnInputListener;

private EditText mDogName, mDogBreed;
private TextView mSet, mCancel;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dialog_google_sign_in, container, false);
    mDogBreed = view.findViewById(R.id.input_breed);
    mDogName = view.findViewById(R.id.input_name);
    mSet = view.findViewById(R.id.action_ok);
    mCancel = view.findViewById(R.id.action_cancel);

    mCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getDialog().dismiss();
        }
    });

    mSet.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String dogname = mDogName.getText().toString();
            String dogbreed = mDogBreed.getText().toString();
            if (dogname.isEmpty() || dogbreed.isEmpty()) {
                Toast.makeText(getContext(),
                        "Please enter the name and breed of your dog" ,Toast.LENGTH_LONG).show();
                return;
            }
            mOnInputListener.sendInput(dogname, dogbreed);
            getDialog().dismiss();
        }
    });
    return view;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        mOnInputListener = (OnInputListener) getTargetFragment();
    } catch (ClassCastException e) {
        Log.d(TAG, e.getMessage());
    }
}
}

这是我的片段的代码:

private void signIWithGoogle(final GoogleSignInAccount account) {
    Log.d("TAG", "firebaseAuthWithGoogle:" + account.getId());
    final AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    final CollectionReference dogowners = db.collection("dog owners");
    dogowners.whereEqualTo("email", account.getEmail())
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    List<DocumentSnapshot> docs = task.getResult().getDocuments();
                    if (docs.isEmpty()) {
                        GoogleSignInDialog dialog = new GoogleSignInDialog();
                        dialog.setTargetFragment(DogOwnerConnectionFragment.this, 1);
                        dialog.show(getFragmentManager(), "MyCustomDialog");
                        firstGoogleSignIn(credential, account);
                    } else if (docs.size() == 1) {
                        GoogleSignIn(credential, account);
                    }
                }
            });
}

真正的问题是如何在我完成对话框之前停止代码运行?

【问题讨论】:

标签: android android-fragmentactivity android-dialogfragment


【解决方案1】:

首先:让你的 Fragment 实现 OnInputListener 和覆盖函数

第二:创建对话框后的setListener

GoogleSignInDialog dialog = new GoogleSignInDialog();
dialog.setListener(this);
.
.

谷歌登录对话框

void setListener(OnInputListener listener){

    mOnInputListener = listener;
}

然后你可以使用这个接口来回调片段并在你关闭对话框之前做一些事情

mCancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        listener.doSomething()//do anything you want

        getDialog().dismiss();
    }
});

希望这会有所帮助。

【讨论】:

  • 问题是android设计的对话框是异步的,所以你不可能在对话框打开时冻结代码,因为下一个调用的函数启动另一个活动,上下文改变了,因此崩溃.
  • 如果我错了,请纠正我,我做了你所展示的并且没有帮助。有没有其他可能的方法来阻止主线程在对话框中运行?
  • @asselqi 什么是崩溃日志
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多