繁体   English   中英

如何从android studio中的片段打开对话框?

[英]How do I open a Dialog from a fragment in android studio?

我正在android中构建一个应用程序。 我正在尝试从片段中打开一个对话框 (timeInfoDialog)。 Dialog 已经在其他一些活动上进行了测试并且它正在工作,但是当我尝试从片段活动中调用它时它崩溃了。

时间信息对话框。

    public class timeInfoDialog extends DialogFragment {
    defining stuff
    private timeInfoDialogListener timeListener;
    private TimePickerDialog timePickerDialog;


    private Button someButtons;
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.layout_add_time_info_dialog, null);
        builder.setView(view).setTitle("Select time info").setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        }).setPositiveButton("ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String WDO=workDayOpen.getText().toString();
                String WDC=workDayClose.getText().toString();
                String STO=saturdayOpen.getText().toString();
                String STC=saturdayClose.getText().toString();
                String SNO=sundayOpen.getText().toString();
                String SNC=sundayClose.getText().toString();
                timeListener.applyTimeInfo(WDO,WDC,STO,STC,SNO,SNC);

            }
        });
        defining stuff
        setOnClickListeners();
        return builder.create();
    }


    private void setOnClickListeners(){
        irrelevant
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("ONATACH:",context.toString());
        try{
            timeListener = (timeInfoDialogListener) context;
        }catch (ClassCastException e){
            throw new ClassCastException(context.toString() + "implementing problem at main activity");
        }
    }

    public interface timeInfoDialogListener{
        void applyTimeInfo(String WDO, String WDC, String STO, String STC, String SNO, String SNC);
    }

}

位置步骤片段

    public class LocationStepFragment extends Fragment implements Step, timeInfoDialog.timeInfoDialogListener{


    deffining stuff

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.location_step_fragment, container, false);

        deffining stuff...

        setOnClickListeners();
        selectCustomLocationBtn.setEnabled(false);
        requestLocationUpdates();

        //initialize your UI

        return v;
    }

    @Override
    public VerificationError verifyStep() {
        //return null if the user can go to the next step, create a new VerificationError instance otherwise
        return null;
    }

    @Override
    public void onSelected() {
        //update UI when selected
    }

    @Override
    public void onError(@NonNull VerificationError error) {
        //handle error inside of the fragment, e.g. show error on EditText
    }
private void setOnClickListeners() {
//calling dialog
        addTimeInfoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openTimeDialog();
            }
        });
    }
    private void requestLocationUpdates(){
        not relevant

    }
//calling dialog method
    public void openTimeDialog(){
        timeInfoDialog timeInfoDialog = new timeInfoDialog();
        timeInfoDialog.show(getActivity().getSupportFragmentManager(),"timeInfoDialog");

    }
//dialog method
    @Override
    public void applyTimeInfo(String WDO, String WDC, String STO, String STC, String SNO, String SNC) {
        Log.d("TimePassed",WDO + " " + WDC + " " + STO +" " + STC + " " + SNO + " " + SNC);
        workdayHours = WDO + "-" + WDC;
        saturdayHours = STO + "-" + STC;
        sundayHours = SNO + "-" + SNC;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        not relevant
    }

    private boolean isServicesOK(){
        not relevant
    }

    private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {

        not relevant

}

我收到以下错误它似乎是 OnAttach() 方法中的某种上下文错误

2019-07-26 18:23:24.522 9552-9552/com.getodevs.jakov.pocketgourmet D/ONATACH::
com.getodevs.jakov.pocketgourmet.AddMealStepActivity@b2d0c06
2019-07-26 18:23:24.522 9552-9552/com.getodevs.jakov.pocketgourmet D/AndroidRuntime: Shutting down VM
2019-07-26 18:23:24.524 9552-9552/com.getodevs.jakov.pocketgourmet E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.getodevs.jakov.pocketgourmet, PID: 9552
    java.lang.ClassCastException: com.getodevs.jakov.pocketgourmet.AddMealStepActivity@b2d0c06implementing problem at main activity
        at com.getodevs.jakov.pocketgourmet.timeInfoDialog.onAttach(timeInfoDialog.java:179)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1404)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)

Exception

java.lang.ClassCastException: com.getodevs.jakov.pocketgourmet.AddMealStepActivity@b2d0c06implementing problem at main activity

抛出表示:

代码试图将对象强制转换为它不是实例的子类。 例如,以下代码生成 ClassCastException:

 Object x = new Integer(0); System.out.println((String)x);

请参阅您的DialogFragmen onAttach方法:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Log.d("ONATACH:",context.toString());
    try{
        timeListener = (timeInfoDialogListener) context;
    }catch (ClassCastException e){
        throw new ClassCastException(context.toString() + "implementing problem at main activity");
    }
}

在这里,您尝试将ContexttimeInfoDialogListener但您的AddMealStepActivity没有实现timeInfoDialogListener

避免在onAttach设置 Lisener 并onAttach使用一种方法:

public void setTimeInfoDialogListener(TimeInfoDialogListener l){
    this.timeListener = l;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM