0

我想創建一個使用dialogFragment自定義對話框,在這裏我無法顯示對話框。主要問題是被覆蓋的代碼沒有被調用。任何人都可以解決此問題。這裏是我的代碼:自定義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

它爲b廣告練習在您的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); 
} 
}