【问题标题】:Refresh EditText value from Dialog Fragment刷新对话框片段中的 EditText 值
【发布时间】:2018-04-19 13:38:14
【问题描述】:

我正在尝试从用户那里选择特定日期,然后在 EditText 中显示它。我正在使用以下方法,在从 onDateSet() 中的 DatePickerDialog 选择日期后,我正在更新 EditText 但编辑文本永远不会更新(不显示所选值)请。指导代码有什么问题?

public class CreateReport extends AppCompatActivity {
    EditText blockName;
    EditText eventDesc;
    public EditText eventDate;
    public EditText eventTime;
    EditText reporterName;
    EditText reporterCnic;
    public static Calendar userCalendar;
    private String Lat, Long;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_report);
//        final ActionBar ab = getSupportActionBar();
//        ab.setTitle("Create Reoprt");
        Bundle bundle = getIntent().getExtras();

        blockName = (EditText) findViewById(R.id.block_name);
        eventDate = (EditText) findViewById(R.id.ev_Date);
        eventTime = (EditText) findViewById(R.id.ev_Time);
        reporterName = (EditText) findViewById(R.id.reporter_name);
        reporterName.setText(AppSettings.getUserName());
        reporterCnic = (EditText) findViewById(R.id.reporter_cnic);
        reporterCnic.setText(AppSettings.getUserCnic());
        reporterName.setEnabled(false);
        reporterCnic.setEnabled(false);
        eventDesc = (EditText) findViewById(R.id.event_desc);
        eventDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDatePickerDialog(v);
            }
        });
        eventTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showTimePickerDialog(v);
            }
        });
        if (bundle != null) {
            Lat = bundle.getString("lat");
            Toast.makeText(getContext(), "Latitude" + Lat, Toast.LENGTH_LONG).show();
            Long = bundle.getString("Long");
        }
    }

    public void showTimePickerDialog(View v) {
        TimePickerFragment newFragment = new TimePickerFragment();
        newFragment.setOnTimeSelectedListener(new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

                String myFormat = "HH:mm";
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
                Calendar cal = Calendar.getInstance();
                cal.set(hourOfDay, minute);

                String formattedTime = sdf.format(cal.getTime());
                eventTime.setText(formattedTime);
                Toast.makeText(CreateReport.this, "Time" + formattedTime, Toast.LENGTH_LONG).show();
            }
        });
        newFragment.show(getSupportFragmentManager(), "timePicker");
    }

    public void showDatePickerDialog(View v) {
        DatePickerFragment newFragment = new DatePickerFragment();
        newFragment.setOnDateSelectedListener(new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                // Do something with the date chosen by the user
                String myFormat = "yyyy-MM-dd";
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
                Calendar cal = Calendar.getInstance();
                cal.set(year, month, dayOfMonth);

                String formattedTime = sdf.format(cal.getTime());
                eventDate.setText(formattedTime);
                Toast.makeText(CreateReport.this, "Date" + formattedTime, Toast.LENGTH_LONG).show();
            }
        });
        newFragment.show(getSupportFragmentManager(), "datePicker");
    }













    public static class TimePickerFragment extends DialogFragment {

        TimePickerDialog.OnTimeSetListener mListener;

        public TimePickerFragment() {
            // Default constructor. Required
        }

        public void setOnTimeSelectedListener(TimePickerDialog.OnTimeSetListener listener) {
            mListener = listener;
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int hour = c.get(Calendar.HOUR_OF_DAY);
            int minute = c.get(Calendar.MINUTE);
            int sec = c.get(Calendar.SECOND);

            // Create a new instance of TimePickerDialog and return it
            return new TimePickerDialog(getContext(),mListener, hour, minute, true);
        }
    }


    public static class DatePickerFragment extends DialogFragment {

        DatePickerDialog.OnDateSetListener mListener;

        public DatePickerFragment() {
            // Default constructor. Required
        }

        public void setOnDateSelectedListener(DatePickerDialog.OnDateSetListener listener) {
            mListener = listener;
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);

            // Create a new instance of DatePickerDialog and return it
            return new DatePickerDialog(getContext(), mListener, year, month, day);
        }
    }
}

XML 代码

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/crt_event_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true">

            <EditText
                android:id="@+id/block_name"
                android:inputType="textAutoComplete"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/loginfields_borders"
                android:hint="Block Name"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp" />

            <EditText
                android:id="@+id/ev_Date"
                android:inputType="datetime"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/loginfields_borders"
                android:hint="Event Date"
                android:focusable="false"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp"
                android:onClick="showDatePickerDialog"/>

            <EditText
                android:id="@+id/ev_Time"
                android:inputType="datetime"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/loginfields_borders"
                android:hint="Event Time"
                android:focusable="false"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp" />


            <EditText
                android:id="@+id/reporter_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:background="@drawable/loginfields_borders"
                android:hint="Reporting Official"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp" />

            <EditText
                android:id="@+id/reporter_cnic"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:background="@drawable/loginfields_borders"
                android:hint="Reporting Official"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp" />

            <EditText
                android:id="@+id/event_desc"
                android:inputType="textAutoComplete"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/loginfields_borders"
                android:hint="Event Description"
                android:padding="12dp"
                android:textColor="#a3a3a3"
                android:textSize="13sp" />

        </LinearLayout>
    </RelativeLayout>

</ScrollView>

单击日期编辑文本后生成的日志以及由于 CreateReport Activity 的破坏

      04-19 21:30:16.281 28941-28941/? I/art: Late-enabling -Xcheck:jni
        Reinit property: dalvik.vm.checkjni= false
        04-19 21:30:16.517 28941-28941/com.example.aiousecurityapplication W/System: ClassLoader referenced unknown path: /data/app/com.example.aiousecurityapplication-1/lib/arm64
        04-19 21:30:16.534 28941-28941/com.example.aiousecurityapplication I/InstantRun: starting instant run server: is main process
        04-19 21:30:16.563 28941-28941/com.example.aiousecurityapplication I/HwCust: Constructor found for class android.app.HwCustActivityImpl
        04-19 21:30:16.614 28941-28941/com.example.aiousecurityapplication W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
        04-19 21:30:16.901 28941-28941/com.example.aiousecurityapplication W/PhoneWindow: Previously focused view reported id 2131296398 during save, but can't be found during restore.
        04-19 21:30:16.907 28941-28941/com.example.aiousecurityapplication I/HwSecImmHelper: mSecurityInputMethodService is null
        04-19 21:30:16.911 28941-28941/com.example.aiousecurityapplication I/HwPointEventFilter: do not support AFT because of no config
        04-19 21:30:16.988 28941-28941/com.example.aiousecurityapplication I/HwCust: Constructor found for class android.net.HwCustConnectivityManagerImpl
        04-19 21:30:17.022 28941-28941/com.example.aiousecurityapplication E/RecyclerView: No adapter attached; skipping layout
        04-19 21:30:17.022 28941-28964/com.example.aiousecurityapplication I/OpenGLRenderer: Initialized EGL, version 1.4
        04-19 21:30:17.033 28941-28964/com.example.aiousecurityapplication W/linker: /vendor/lib64/libhwuibp.so: unused DT entry: type 0xf arg 0xe3a
        04-19 21:30:17.111 28941-28941/com.example.aiousecurityapplication W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in 
        android.widget.ListView
        04-19 21:30:17.208 28941-28941/com.example.aiousecurityapplication E/RecyclerView: No adapter attached; skipping layout
        04-19 21:30:18.734 28941-28946/com.example.aiousecurityapplication I/art: Do partial code cache collection, code=23KB, data=29KB
        04-19 21:30:18.735 28941-28946/com.example.aiousecurityapplication I/art: After code cache collection, code=23KB, data=29KB
        Increasing code cache capacity to 128KB

【问题讨论】:

    标签: android datepicker android-dialogfragment


    【解决方案1】:

    试试下面的代码。

    这个想法是实现DatePickerDialog.OnDateSetListener并将其传递给DialogFragment。 不要将时间存储在静态字段中,因为您可以直接在用户选择日期时调用的 Dialog 方法中访问此信息 (public void onDateSet(DatePicker view, int year, int month, int day))。

    由于监听器是在 Activity 中实现的,因此您可以访问 EventDate 字段。

    顺便说一句,我已将其重命名为 mEventDate,因为字段/变量不应以大写字母作为首字母。以“m”作为起始字母命名字段是最佳实践,因为它可以区分类变量和局部变量。

    另一个改进应该是将DatePickerFragment 放在一个单独的类文件中,因为它会造成混淆。每个人(包括我自己)都认为您可以直接访问EventDate 字段,因为我们在快速阅读代码时没有注意到静态类。

    已编辑

    public class CreateReportActivity extends AppCompatActivity {
    
        public EditText mEventDate;
        private String Lat, Long;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_create_report);
    
            mEventDate = (EditText) findViewById(R.id.ev_Date);
        }
    
        public void showDatePickerDialog(Context context, View v) {
            DatePickerFragment newFragment = new DatePickerFragment();
            newFragment.setOnDateSelectedListener(new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                    // Do something with the date chosen by the user
                    String myFormat = "yyyy-MM-dd";
                    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
                    Calendar cal = Calendar.getInstance();
                    cal.set(year, month, dayOfMonth);
    
                    String formattedTime = sdf.format(cal.getTime());
                    mEventDate.setText(formattedTime);
                    Toast.makeText(context, "Date" + formattedTime, Toast.LENGTH_LONG).show();
                }
            });
            newFragment.show(getSupportFragmentManager(), "datePicker");
        }
    
        public static class DatePickerFragment extends DialogFragment {
    
            DatePickerDialog.OnDateSetListener mListener;
    
            public DatePickerFragment() {
                // Default constructor. Required
            }
    
            public void setOnDateSelectedListener(DatePickerDialog.OnDateSetListener listener) {
                mListener = listener;
            }
    
            @NonNull
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the current date as the default date in the picker
                final Calendar c = Calendar.getInstance();
                int year = c.get(Calendar.YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);
    
                // Create a new instance of DatePickerDialog and return it
                return new DatePickerDialog(getContext(), mListener, year, month, day);
            }
        }
    }
    

    【讨论】:

    • 感谢您的时间和精力。我已经尝试过这段代码,当我启动 CreateReport Activity 时。它崩溃并返回调用 Activity。它发生得太快以至于日志被冲走了?请。指南
    • 我已经更新了。用新的再试一次。如果它崩溃,请发布日志,否则我无能为力
    • 好吧,我想通了。更改 public void showDatePickerDialog(View v) 的方法(基本上删除上下文)并在 Toast 中执行:Toast.makeText(CreateReport.this, "Date" + formattedTime, Toast.LENGTH_LONG).show();
    • 当您从视图调用onClick 上的方法(在您的情况下为EditText)时,唯一的参数必须是视图,否则系统找不到该方法。所以基本上你的应用程序崩溃是因为你试图调用一个不存在的方法
    • 真棒男人这是我已经纠正的错误,它工作正常。我花了几个小时在这个
    【解决方案2】:

    它可以通过多种方式实现。我推荐第一个,您可以根据需要自定义OnDateSelected界面。并从任何班级调用日期选择器。

    public class CreateReport extends AppCompatActivity {
        public EditText EventDate;
        public static Calendar usercalendar;
        private String Lat, Long;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_create_report);
    
            EventDate = (EditText) findViewById(R.id.ev_Date);
    
    
        }
        public void showDatePickerDialog(View v) {
            DialogFragment newFragment = new DatePickerFragment(new DatePickerFragment.OnDateSelected() {
                @Override
                public void onSelected(String date) {
                    EventDate.setText(date);
                }
            });
            newFragment.show(getSupportFragmentManager(), "datePicker");
        }
        public static class DatePickerFragment extends DialogFragment
                implements DatePickerDialog.OnDateSetListener {
            Context context;
    
            OnDateSelected onDateSelected;
    
            public DatePickerFragment(OnDateSelected onDateSelected) {
                this.onDateSelected = onDateSelected;
            }
    
            interface OnDateSelected{
                void onSelected(String date);
            }
    
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the current date as the default date in the picker
                final Calendar c = Calendar.getInstance();
                int year = c.get(Calendar.YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);
                usercalendar.set(year, month, day);
    
                // Create a new instance of DatePickerDialog and return it
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }
    
            public void onDateSet(DatePicker view, int year, int month, int day) {
                // Do something with the date chosen by the user
                String myFormat = "yyyy-MM-dd";
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
    
                View dialogName = getActivity().getLayoutInflater().inflate(R.layout.activity_create_report, null);
                ((EditText) dialogName.findViewById(R.id.ev_Date)).setText(sdf.format(usercalendar.getTime()));
                Toast.makeText(getContext(), "Date" + sdf.format(usercalendar.getTime()), Toast.LENGTH_LONG).show();
                if (onDateSelected!=null) onDateSelected.onSelected(sdf.format(usercalendar.getTime())); 
            }
        }
    }
    

    或者

    public class CreateReport extends AppCompatActivity {
        public EditText EventDate;
        public static Calendar usercalendar;
        private String Lat, Long;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_create_report);
    
            EventDate = (EditText) findViewById(R.id.ev_Date);
    
    
        }
        public void showDatePickerDialog(View v) {
            DatePickerFragment newFragment = new DatePickerFragment(EventDate);
            newFragment.setEditText(EventDate);
            newFragment.show(getSupportFragmentManager(), "datePicker");
        }
        public static class DatePickerFragment extends DialogFragment
                implements DatePickerDialog.OnDateSetListener {
            Context context;
            private EditText editText;
    
            public void setEditText(EditText editText) {
                this.editText = editText;
            }
    
            interface OnDateSelected{
                void onSelected(String date);
            }
    
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the current date as the default date in the picker
                final Calendar c = Calendar.getInstance();
                int year = c.get(Calendar.YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);
                usercalendar.set(year, month, day);
    
                // Create a new instance of DatePickerDialog and return it
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }
    
            public void onDateSet(DatePicker view, int year, int month, int day) {
                // Do something with the date chosen by the user
                String myFormat = "yyyy-MM-dd";
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
    
                View dialogName = getActivity().getLayoutInflater().inflate(R.layout.activity_create_report, null);
                ((EditText) dialogName.findViewById(R.id.ev_Date)).setText(sdf.format(usercalendar.getTime()));
                Toast.makeText(getContext(), "Date" + sdf.format(usercalendar.getTime()), Toast.LENGTH_LONG).show();
                if (editText !=null) editText .setText(sdf.format(usercalendar.getTime()));
            }
        }
    }
    

    【讨论】:

    • 第一种方法给出了这个错误“避免片段中的非默认构造函数:使用默认构造函数加上 Fragment#setArguments(Bundle) 而不是 [ValidFragment]”
    • 是的,我看到了,我现在不在电脑上,你可以在构造函数中设置与edittext相同的界面
    • 如果你通过某种方法设置界面,它肯定会起作用,或者我会在一段时间后更新我的帖子
    • 我很抱歉没有明白你在说什么......你能解释一下为什么下面的代码行不起作用吗? ((EditText) getActivity().findViewById(R.id.ev_Date)).setText(sdf.format(usercalendar.getTime()));
    • 还是我的问题?
    【解决方案3】:

    一般使用EventDate.setText(sdf.format(usercalendar.getTime()));

    一切正常。

    【讨论】:

      【解决方案4】:
      private void getDatePickerPOP() {
      
          final Calendar calendar = Calendar.getInstance();
          int mDay = calendar.get(Calendar.DAY_OF_MONTH);
          int mMonth = calendar.get(Calendar.MONTH);
          int mYear = calendar.get(Calendar.YEAR);
      
          DatePickerDialog mDatePicker = new DatePickerDialog(ViewersList.this, new DatePickerDialog.OnDateSetListener() {
              public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
      
                  Calendar calander2 = Calendar.getInstance();
                  calander2.setTimeInMillis(0);
                  calander2.set(selectedyear, selectedmonth, selectedday, 0, 0, 0);
                  java.util.Date SelectedDate = (java.util.Date) calander2.getTime();
                  DateFormat dateformat_US = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.US);
                  String StringDateformat_US = dateformat_US.format(SelectedDate);
                  EventTextView.setText(StringDateformat_US);
              }
          }, mYear, mMonth, mDay);
          mDatePicker.getDatePicker().setMaxDate(System.currentTimeMillis() + 1000);
          mDatePicker.setTitle("Select date");
          mDatePicker.show();
      }
      

      【讨论】:

      • EventDate 在这个方法中是不可访问的,即使它是公开的。还有其他方法吗?
      猜你喜欢
      • 2012-10-10
      • 2020-07-31
      • 2017-08-09
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多