0

dialogFragment を使用してカスタム ダイアログを作成しようとしていますが、ここではダイアログを表示できません。主な問題は、オーバーライドされたコードが呼び出されないことです。誰でもこの問題を解決できますか。これが私のコードです:

BaseDialogFragment.java

public class BaseDialogFragment extends DialogFragment {
    private int layoutId;
    protected Activity mActivity;

    public void setLayoutId(int layoutId){
        this.layoutId = layoutId;
    }

    public BaseDialogFragment(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setStyle(BaseDialogFragment.STYLE_NO_TITLE, R.style.share_dialog);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View v = inflater.inflate(layoutId, container, false);
        return v;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }

    public void initViews(View v){
        getDialog().setCanceledOnTouchOutside(true);
    }
}

CustomDialog.java:

@SuppressLint("ValidFragment")
public class CustomDialog extends BaseDialogFragment  {
    private String message;
    private btnOkClick okClickListerner;
    private TextView simpleMsg;
    private WebView termsConditionWeb;
    private Button okBtn;
    Boolean isNormalDialog = false;
    private Typeface fontClanProBold;
    private View v;
    private Context context;

    public interface btnOkClick{
        void clicked();
    }

    public CustomDialog(String message, btnOkClick okClickListerner, Boolean isNormalDialog){
        this.message = message;
        this.okClickListerner = okClickListerner;
        this.isNormalDialog = isNormalDialog;
        this.mActivity = null;
        setLayoutId(R.layout.activity_custom_dialog);
        initViews(v);
           }

    @Override
    public void initViews(View v) {
        super.initViews(v);
        this.simpleMsg = (TextView) v.findViewById(R.id.simpleMsg);
        this.termsConditionWeb= (WebView) v.findViewById(R.id.termsConditionWeb);
        this.okBtn = (Button) v.findViewById(R.id.okBtn);
        fontClanProBold = Typeface.createFromAsset(context.getAssets(), "fonts/ufonts.com_clanpro-bold.ttf");
        Log.e("isNormal", isNormalDialog.toString());
        if(isNormalDialog){
            this.simpleMsg.setVisibility(View.VISIBLE);
            this.simpleMsg.setText(message);
            this.simpleMsg.setTypeface(fontClanProBold);
        } else {
            this.termsConditionWeb.setVisibility(View.VISIBLE);
            this.termsConditionWeb.loadData(message, "text/html", "UTF-8");
        }
        setCancelable(false);
        initEvent(v);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = activity;
    }

    private void initEvent(View v){
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(okClickListerner != null){
                    okClickListerner.clicked();
                }
                dismiss();
            }
        });
    }

    public static void ShowDialog(FragmentManager fm, String message, btnOkClick okClickListerner, Boolean isNormalDialog){
        CustomDialog dialog = new CustomDialog(message, okClickListerner, isNormalDialog);
        dialog.show(fm, "");
    }
}

MainActivity.java

onClickListener 内

CustomDialog.ShowDialog(getSupportFragmentManager(), getResources().getString(R.string.message_register), new CustomDialog.btnOkClick() {
                    @Override
                    public void clicked() {
                        finish();
                    }
                }, isNormalDialog);
4

1 に答える 1

0

Dialog コンストラクター内で値を設定することはお勧めできません。代わりに、値を引数として渡し、onCreate コールバックで初期化します。さらに、アクティビティのインスタンスをフラグメントに保存しないようにする必要があります。これにより、メモリ リークが発生する可能性があります。代わりに、CustomDialog または BaseDialogFragment で、それらを使用するすべてのアクティビティが実装する必要があるインターフェイスを作成することをお勧めします。次に、Dialog に onClickListener インターフェイスを実装する必要があり、その中でmListener.onButtonClickListener(). DialogFragmentの例を参照してください。

CustomDialog は次のようになります。

public class CustomDialog extends BaseDialogFragment {

private myFragmentInterface mListener;

public static CustomDialog newInstance(String message, Boolean isNormalDialog){
    Bundle args = new Bundle();
    args.putString(MESSAGE_ARG_KEY, message);
    args.putBoolean(TYPE_ARG_KEY, isNormalDialog);
    CustomDialog instance = new CustomDialog();
    instance.setArguments(args);
}

@override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    message = getArguments().getStirng(MESSAGE_ARG_KEY);
    isNormalDialog = getArguments().getBoolean(TYPE_ARG_KEY);
}

@override
public void onAttach(Activity activity){
    super.onAttach();
    try{
        mListener = (myFragmentInterface) activity;
    }catch(ClassCastException e){
        throw new ClassCastException("activiy must implement myFragmentInterface");
    }
}

public void onDetach(){
    super.onDetach();
    mListener = null;
}

public interface myFragmentInterface{
    onButtonClickListener(String... params);
}
}
于 2016-04-03T16:42:46.427 に答える