Хобрук: Ваш путь к мастерству в программировании

Как получить данные из диалогового окна настройки в действие и передать эти данные в recyclerView

Как получить данные из диалогового окна настройки в Activity и передать эти данные в recyclerView.

Я пробовал ссылку ниже, но не работал, Как передать значения между диалогом и действием?

Ниже представлен класс Activity

public class MutipleResourcesActivity extends AppCompatActivity implements View.OnClickListener, AddEachResourceDialog.OnMyDialogResult{

    RecyclerView list_resources;
    ImageView img_addResource;

    private ArrayList<AddResource> resources = new ArrayList<>();
    public AddResourceAdapter resourceAdapter;

    AddEachResourceDialog resourceDialog;

    String result1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.add_multiple_resources);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setContentInsetsRelative(0, toolbar.getContentInsetEnd());
        //toolbar.setContentInsetsAbsolute(0,0);
        setSupportActionBar(toolbar);
        toolbar.setTitle("Enter Timings");



        list_resources = (RecyclerView) findViewById(R.id.recyclerview_multiResources);
        img_addResource = (ImageView) findViewById(R.id.img_addResource);
        img_addResource.setOnClickListener(this);

    }

   private void setAdapter() {

    resourceAdapter = new AddResourceAdapter(resources);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    list_resources.setLayoutManager(mLayoutManager);
    list_resources.setItemAnimator(new DefaultItemAnimator());



    AddResource ar = new AddResource(mspinnerValue, mstartTime,mendTime);
    resources.add(ar);
    resourceAdapter.notifyDataSetChanged();

    list_resources.setAdapter(resourceAdapter);

    //resources.add(result1);
}


    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.img_addResource:

                try {

                    AddEachResourceDialog addEachResource = new AddEachResourceDialog(this);
                    //addEachResource.show(getSupportFragmentManager(), "Dialog");
                    addEachResource.show();
                    addEachResource.setWindowSize();

                }catch (Exception e){
                    e.printStackTrace();
                }
                break;
        }

    }

    @Override
    public void finish(String spinnerValue, String startTime, String endTime) {

        System.out.println("####### spinnerValue : "+spinnerValue);
        System.out.println("####### startTime : "+startTime);
        System.out.println("####### endTime : "+endTime);

        setAdapter();
    }
}

Ниже приведен мой диалог настройки с интерфейсом «OnMyDialogResult».

public class AddEachResourceDialog extends BaseDialog implements View.OnClickListener{

    private Context context;

    private static DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    private static DateFormat tf = new SimpleDateFormat("HH:mm");
    private Calendar startDateTime, finishDateTime;

    private DatePickerDialog startDatePicker, finishDatePicker;
    private TimePickerDialog startTimePicker, finishTimePicker;


    Spinner spinner_resources;
    EditText edt_startTime, edt_endTime;
    Button btn_save, btn_cancel;

    TextView tv_basicStartDate, tv_basicStartTime, tv_basicFinishDate, tv_basicFinishTime;

    OnMyDialogResult mDialogResult;

    AddResource ads = new AddResource();

    public AddEachResourceDialog(Context context) {
        super(context);

        this.context = context;
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            setContentView(R.layout.add_each_resource);

            setTitle("Add Timings");

            spinner_resources = (Spinner) findViewById(R.id.spinner_resources);

            tv_basicStartDate = (TextView) findViewById(R.id.txt_basicStartDate);
            tv_basicFinishDate = (TextView) findViewById(R.id.txt_basicFinishDate);
            tv_basicStartTime = (TextView) findViewById(R.id.txt_basicStartTime);
            tv_basicFinishTime = (TextView) findViewById(R.id.txt_basicFinishTime);

            tv_basicStartDate.setOnClickListener(this);
            tv_basicFinishDate.setOnClickListener(this);
            tv_basicStartTime.setOnClickListener(this);
            tv_basicFinishTime.setOnClickListener(this);

            startDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime.add(Calendar.DAY_OF_MONTH, 1);

            tv_basicStartDate.setText(df.format(startDateTime.getTime()));
            tv_basicStartTime.setText(tf.format(startDateTime.getTime()));
            tv_basicFinishDate.setText(df.format(finishDateTime.getTime()));
            tv_basicFinishTime.setText(tf.format(finishDateTime.getTime()));


            btn_save = (Button) findViewById(R.id.saveBtn);
            btn_cancel = (Button) findViewById(R.id.cancelBtn);
            btn_save.setOnClickListener(this);
            btn_cancel.setOnClickListener(this);

        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()){

            case R.id.saveBtn:


                    mDialogResult = new OnMyDialogResult() {
                        @Override
                        public void finish(String spinnerValue, String startTime, String endTime) {

                            ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
                            ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
                            ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));

                            ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
                            ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));


                            mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());



                            mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());

                        }
                    };                 

                AddEachResourceDialog.this.dismiss();

                break;

            case R.id.cancelBtn:
                //onBackPressed();
                AddEachResourceDialog.this.dismiss();


                break;

            default:
                break;
        }

    }

    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        //void finish(AddEachResourceDialog result);
        void finish(String spinnerValue, String startTime, String endTime);
    }
}

Не получаю данные из диалогового окна в Activity, и я должен передать эти данные в recyclerview. Пожалуйста, помогите мне с этим. Заранее спасибо.


  • Вы пробовали использовать интерфейс? 26.10.2018
  • Да, в диалоговом окне настройки у него есть интерфейс, но данные не передаются из диалогового окна настройки в действие. Пожалуйста, помогите мне с этим @edwin 26.10.2018
  • у кого-то была похожая проблема с вашей, проверьте это: stackoverflow.com/questions/4279787/ 26.10.2018
  • Я ссылался на ту же ссылку, которую вы упомянули, но она не сработала. 26.10.2018
  • Вы должны иметь возможность получать данные из пользовательского диалога в свою деятельность, если вы используете интерфейс. Пробовали ли вы использовать точку останова, чтобы проверить, вызывает ли ваш код когда-либо методы finish(), которые вы переопределяете? 26.10.2018
  • Это не вызов finish() @edwin 26.10.2018
  • Значит, что-то не так с реализованным вами интерфейсом. Кстати, вы должны попробовать что-то вроде ((AddEachResourceDialog.OnMyDialogResult) getActivity).finish(ads.getName(), ads.getBasicStartDate() +:+ads.getBasicStartTime(), ads.getBasicFinishDate() +:+ads.getBasicFinishTime() ); 26.10.2018
  • Предполагая, что ваш диалог находится в том же контексте вашей деятельности. 26.10.2018
  • Вышеприведенный код также не работает edwin. Пожалуйста, проверьте опубликованный код. 26.10.2018
  • Кстати, я думаю, что ваша проблема заключается в методе .finish(), который вы вызываете. Мне не кажется, что вы на самом деле вызываете переопределенный метод в действии, но вместо этого вы вызываете метод finish() класса диалога. Следовательно, вы ничего не получите, поскольку он рекурсивен своего собственного класса. Вам нужно получить ссылку на действие, которое переопределяет метод .finish() в вашем пользовательском диалоговом окне, и использовать эту ссылку для переопределения метода в вашем пользовательском диалоговом окне. 26.10.2018
  • Я изменил метод, хотя он не сработал. Не могли бы вы помочь мне с этим edwin. 26.10.2018
  • Вы вообще можете сделать getActivity()? 26.10.2018
  • Нет, getActivity() не работает в моем классе Activity 26.10.2018
  • Я имею в виду вызов этого в вашем пользовательском диалоговом окне. 26.10.2018
  • Нет, getActivity() не работает и в моем custonDialog. 26.10.2018
  • я разместил ответ 26.10.2018
  • Эдвин не сработал. Не повезло 26.10.2018
  • это должно работать, потому что я проверил это на своем конце. 26.10.2018
  • edwin, это не работает. Пожалуйста, посмотрите на код. Метод обратного вызова не вызывается из customDialog. 26.10.2018

Ответы:


1

Изменить следующий код:

public class AddEachResourceDialog extends BaseDialog implements View.OnClickListener{

    private Context context;

    private static DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    private static DateFormat tf = new SimpleDateFormat("HH:mm");
    private Calendar startDateTime, finishDateTime;

    private DatePickerDialog startDatePicker, finishDatePicker;
    private TimePickerDialog startTimePicker, finishTimePicker;


    Spinner spinner_resources;
    EditText edt_startTime, edt_endTime;
    Button btn_save, btn_cancel;

    TextView tv_basicStartDate, tv_basicStartTime, tv_basicFinishDate, tv_basicFinishTime;

    OnMyDialogResult mDialogResult;

    AddResource ads = new AddResource();

    public AddEachResourceDialog(MutipleResourcesActivity activity) {
        super(activity);

        mDialogResult = activity;
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            setContentView(R.layout.add_each_resource);

            setTitle("Add Timings");

            spinner_resources = (Spinner) findViewById(R.id.spinner_resources);

            tv_basicStartDate = (TextView) findViewById(R.id.txt_basicStartDate);
            tv_basicFinishDate = (TextView) findViewById(R.id.txt_basicFinishDate);
            tv_basicStartTime = (TextView) findViewById(R.id.txt_basicStartTime);
            tv_basicFinishTime = (TextView) findViewById(R.id.txt_basicFinishTime);

            tv_basicStartDate.setOnClickListener(this);
            tv_basicFinishDate.setOnClickListener(this);
            tv_basicStartTime.setOnClickListener(this);
            tv_basicFinishTime.setOnClickListener(this);

            startDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime = (GregorianCalendar) GregorianCalendar.getInstance();
            finishDateTime.add(Calendar.DAY_OF_MONTH, 1);

            tv_basicStartDate.setText(df.format(startDateTime.getTime()));
            tv_basicStartTime.setText(tf.format(startDateTime.getTime()));
            tv_basicFinishDate.setText(df.format(finishDateTime.getTime()));
            tv_basicFinishTime.setText(tf.format(finishDateTime.getTime()));


            btn_save = (Button) findViewById(R.id.saveBtn);
            btn_cancel = (Button) findViewById(R.id.cancelBtn);
            btn_save.setOnClickListener(this);
            btn_cancel.setOnClickListener(this);

        }catch (Exception e){
            e.printStackTrace();
        }
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()){

            case R.id.saveBtn:

ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
                            ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
                            ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));

                            ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
                            ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));

//Which one you need?
                            mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());

                            mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());



                AddEachResourceDialog.this.dismiss();

                break;

            case R.id.cancelBtn:
                //onBackPressed();
                AddEachResourceDialog.this.dismiss();


                break;

            default:
                break;
        }

    }

    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        //void finish(AddEachResourceDialog result);
        void finish(String spinnerValue, String startTime, String endTime);
    }
}
26.10.2018
  • Прежде всего прокомментируйте метод setDialogResult(). Это выглядит бесполезно. Во-вторых - логируйте после каждого шага. Нужно указать, где именно не работает. Возможно, переменная mDialogResult где-то перезаписана, поэтому не может передать данные в активность. 26.10.2018

  • 2

    Измените следующую часть вашего диалогового кода,

        case R.id.saveBtn:
    
        ads.setName(String.valueOf(spinner_resources.getSelectedItem().toString()));
        ads.setBasicStartDate(String.valueOf(tv_basicStartDate.getText().toString()));
        ads.setBasicFinishDate(String.valueOf(tv_basicFinishDate.getText().toString()));
        ads.setBasicStartTime(String.valueOf(tv_basicStartTime.getText().toString()));
        ads.setBasicFinishTime(String.valueOf(tv_basicFinishTime.getText().toString()));
    
        //Use either this finish method or that one, i don't see why did you call 
        //finish() twice  
        mDialogResult.finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());
    
        mDialogResult.finish(ads.getName(), ads.getStartTime(), ads.getEndTime());
    
    
        AddEachResourceDialog.this.dismiss();
        break;
    

    Наконец, в своей деятельности замените метод onclick на этот

        public void onClick(View v) {
    
            switch (v.getId()) {
                case R.id.img_addResource:
    
                    try {
    
                        AddEachResourceDialog addEachResource = new AddEachResourceDialog(this);
                        //addEachResource.show(getSupportFragmentManager(), "Dialog");
                        addEachResource.setDialogResult(this);
                        addEachResource.show();
                        addEachResource.setWindowSize();
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
            }
    
        }
    

    А у вас все хорошо.

    26.10.2018
  • вы поместили свой метод setDialogResult(this) после AddEachResourceDialog addEachResource = new AddEachResourceDialog(this); ? 26.10.2018
  • Это не занятия в классе Activity Jaydeep. Не могли бы вы помочь мне в этом, пожалуйста. 26.10.2018
  • @Naveen, я отредактировал свой ответ, вы уверены, что ваш клик выглядит именно так? потому что это должно работать, если код такой. 26.10.2018
  • Я пробовал с приведенным выше кодом, не получилось. Не повезло, Джейдип. 26.10.2018
  • вы можете поставить точки отладки и проверить, вызывается ли метод finish(). 26.10.2018

  • 3

    После обсуждения и просмотра кодов несколько раз. Я уверен, что методы .finish(), которые вызываются в пользовательском диалоговом окне, не переопределяются в классе активности. Что объясняет, почему данные не передаются. Что нужно сделать, так это получить ссылку на вашу активность и вызвать метод .finish(), чтобы переопределить метод, как он есть в активности, а не в пользовательском диалоговом окне.

    Это приведет к приведению контекста, который был инициализирован в MutipleResourcesActivity, реализующем интерфейс OnMyDialogResult, и вызовет метод переопределения .finish в действии. Пожалуйста, используйте это в своем пользовательском диалоговом классе. (приведение возможно, если текущий контекст является активностью, реализующей интерфейс OnMyDialogResult).

    ((AddEachResourceDialog.OnMyDialogResult) context).finish(ads.getName(), ads.getBasicStartDate() +":"+ads.getBasicStartTime(), ads.getBasicFinishDate() +":"+ads.getBasicFinishTime());
    
    26.10.2018
  • Привет, Эдвин, наконец, данные приходят, но когда я добавляю данные во второй раз, не устанавливая данные в recylerview. Я отредактировал сообщение setAdapter — это метод настройки данных. 26.10.2018
  • Я не совсем понимаю, что вы. В любом случае, мой ответ решил вашу проблему? Если это так, пожалуйста, отметьте ответ как ответ. Если нет, пожалуйста, опубликуйте ответ, который ответил на ваш вопрос. Если у вас есть другие вопросы, пожалуйста, напишите еще один вопрос. 29.10.2018
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...