0

Ich versuche, einen benutzerdefinierten Dialog mit dialogFragment zu erstellen, hier kann ich den Dialog nicht anzeigen. Das Hauptproblem ist, dass der überschriebene Code nicht aufgerufen wird. Kann jemand dieses Problem beheben? Hier ist mein Code:Benutzerdefiniertes DialogFragment funktioniert nicht

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

in einem OnClickListener

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

Antwort

0

Es b ad üben Sie, um Werte innerhalb Ihres Dialogkonstruktors zu setzen. Übergeben Sie stattdessen Ihre Werte als Argumente und initialisieren Sie sie bei OnCreate Callback. Darüber hinaus sollten Sie vermeiden, dass Ihre Aktivität in Ihrem Fragment gespeichert wird, da dies zu Speicherlecks führen kann. Stattdessen empfehle ich Ihnen, eine Schnittstelle in Ihrem CustomDialog oder in Ihrem BaseDialogFragment zu erstellen, dass alle Aktivitäten, die sie verwenden, implementieren müssen. Dann müssen Sie onClickListener-Schnittstelle auf Ihrem Dialog implementieren und darin können Sie mListener.onButtonClickListener() aufrufen. Siehe das Beispiel DialogFragment.

Ihre CustomDialog würde in etwa so aussehen:

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); 
} 
}