0

Я пытаюсь создать настраиваемый диалог с помощью dialogFragment, здесь я не могу отобразить диалог. Основная проблема заключается в том, что чрезмерный код не вызван. Может ли кто-нибудь исправить эту проблему. Вот мой код:Custom 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); 

ответ

0

Это б чтобы установить значения внутри вашего конструктора диалога. Вместо этого передайте свои значения в качестве аргументов и инициализируйте их при обратном вызове onCreate. Кроме того, вы должны избегать сохранения экземпляров вашей активности на вашем фрагменте, это может привести к утечке памяти. Вместо этого я рекомендую вам создать интерфейс на вашем CustomDialog или в BaseDialogFragment, который должен выполнять все действия, которые их используют. Затем вам нужно внедрить интерфейс 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); 
} 
} 
Смежные вопросы