java - 如何从 android studio 中的片段打开对话框?
问题描述
我正在android中构建一个应用程序。我正在尝试从片段中打开一个对话框(timeInfoDialog)。对话框已经在其他一些活动上进行了测试并且它正在工作,但是当我尝试从片段活动中调用它时它崩溃了。
时间信息对话框。
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);
}
}
位置StepFragment
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);
请参阅onAttach
您的方法DialogFragmen
:
@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");
}
}
在这里,您尝试强制Context
转换,timeInfoDialogListener
但您AddMealStepActivity
没有实现timeInfoDialogListener
.
避免设置 LiseneronAttach
并为此使用方法:
public void setTimeInfoDialogListener(TimeInfoDialogListener l){
this.timeListener = l;
}
推荐阅读
- ios - 将 Facebook 图像设置为按钮背景
- javascript - jQuery克隆表行
- azure-devops - 在 Azure DevOps 中是否有一种 GUI 方法可以禁用基于 YAML 的管道中的任务?
- google-cloud-platform - 无法导入图像数据集 gcloud automl,错误:标签已经是基本事实
- c# - 如何在 c# 中使用正则表达式获取某个特定单词之前的数字?
- java - NullPointerException:尝试调用虚拟方法'void org.apache.cordova.CordovaPlugin.privateInitialize
- python - 合并年和周列以在 python 中创建日期时间和排序
- roku - 如何增加 Roku 的响应时间
- machine-learning - 当标注维度太大,想找另一种方式而不是one-hot编码时
- html - AMP Carousel 不能用于多个项目