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

Я создал собственный диалог и хочу закрыть его при нажатии кнопки Отмена. Я искал в Google, большинство людей используют Dialog или AlertDialog, но я ничего подобного не использую. Это мой TextDialogActivity, который загружается при нажатии кнопки в моем приложении. Из MainActivity я просто отображаю другое действие как настраиваемый диалог. Когда я нажимаю кнопку Save в диалоговом окне, я хочу получить доступ к данным в родительском действии, которые хранятся в переменной textData в дочернем действии.

  public class TextDialogActivity extends AppCompatActivity {
  TabHost tabHost;
  private static final int FILE_SELECT_CODE = 0;
  private String textData;

  private Button browse;
  private Button cancel_button1;
  private Button cancel_button2;
  private TextView text_preview;

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

      browse = findViewById(R.id.browse_file_button);
      text_preview = findViewById(R.id.text_preview);
      cancel_button1 = findViewById(R.id.cancel_button);
      cancel_button2 = findViewById(R.id.cancel_button2);

      tabHost = findViewById(R.id.tabHost);
      tabHost.setup();

      TabHost.TabSpec spec=tabHost.newTabSpec("tag1");

      spec.setContent(R.id.encode_dialog_text_tab);
      spec.setIndicator("Edit Text");
      tabHost.addTab(spec);

      spec=tabHost.newTabSpec("tag2");
      spec.setContent(R.id.encode_dialog_browse_tab);
      spec.setIndicator("Browse");
      tabHost.addTab(spec);

      browse.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              showFileChooser();
          }
      });

      cancel_button1.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
                // close dialog
          }
      });

      cancel_button2.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
                 // close dialog
          }
      });

   }
 }

Я добавил @style/Theme.AppCompat.Dialog в свой AndroidManifest.xml, чтобы создать свой диалог.

 <activity
        android:name=".activity.TextDialogActivity"
        android:theme="@style/Theme.AppCompat.Dialog"
        android:label="Secret Message">
 </activity>

Это скриншот.


person Jai Prak    schedule 29.01.2018    source источник
comment
Можете ли вы уточнить, отображаете ли вы диалоговое окно, а затем хотите закрыть диалоговое окно?   -  person MaYur MahAjan    schedule 29.01.2018
comment
@Jai Prak Если я правильно понял, вы хотите открыть всплывающее окно (которое является действием) из родительского действия и получить доступ к данным из родительского действия во всплывающем окне? В этом случае вам придется использовать намерение.   -  person Banana    schedule 29.01.2018
comment
Вместо Activity вы можете создать диалоговое окно, которое расширяет Dailog, и там вы можете делать свои вещи... и вы можете получить доступ к методу отклонения в этом диалоговом окне.   -  person MaYur MahAjan    schedule 29.01.2018
comment
@Кемо, да, то же самое. Но я хочу получить доступ к данным из всплывающего окна для родительской активности.   -  person Jai Prak    schedule 29.01.2018
comment
После добавления скриншота... просто измените AppCompactActivity на Dialog... и используйте метод "отклонить"   -  person MaYur MahAjan    schedule 29.01.2018
comment
Создайте конструктор и передайте данные из конструктора.   -  person MaYur MahAjan    schedule 29.01.2018
comment
@JaiPrak Я думаю, что это лучшее решение, я сделал то же самое.   -  person Banana    schedule 29.01.2018
comment
Создание активности — не лучший способ для диалога.   -  person MaYur MahAjan    schedule 29.01.2018


Ответы (3)


Вы должны относиться к этому как к любой другой деятельности. Просто используйте намерение для отправки ваших данных из всплывающего окна в родительское действие.

Вы должны использовать data Intent в onActivityResult(int requestCode, int resultCode, Intent data) вот так во всплывающем окне:

saveButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        Intent intent = new Intent();
        intent.putStringArrayListExtra("popup_data", data);
        setResult(RESULT_OK, intent);
        finish();
    }
});  

И в родительском:

if (resultCode == RESULT_OK) { 
    ArrayList<String> popup_data= 
    data.getExtras().getStringArrayList("popup_data");
}
person Banana    schedule 29.01.2018
comment
Я хочу получить доступ к данным из всплывающего окна к родительской активности, а не к родительскому всплывающему окну. - person Jai Prak; 29.01.2018
comment
Это очень похоже. Используйте намерение отправить свои данные из всплывающего окна в родительскую активность, затем в родительской активности используйте onActivityResult: public void onActivityResult(int requestCode, int resultCode, Intent data) - person Banana; 29.01.2018
comment
@JaiPrak Рад, что это помогло :) - person Banana; 30.01.2018

Как упоминалось выше, Activity не лучший вариант для этого.

Но просто начните свой диалог как действие для результата.

Затем, когда пользователь нажимает кнопку, возвращает результат и завершает действие.

Затем в основном действии вы получаете результат в onActivityResult

См. пример здесь или здесь

Запустить действие (в MainActivity)

 Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, REQUEST_CODE);

Установите результат (в диалоговом окне)

ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
    @Override
    public void onEntryClick(View view, int position) {
        Intent intent = new Intent();
        intent.putExtra("pos", position);
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
});

Получить результат (в MainActivity)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}
person Eselfar    schedule 29.01.2018

Мое пользовательское диалоговое/всплывающее окно само по себе является деятельностью. Я не использую Dialog или AlertDialog. Чтобы закрыть это диалоговое окно при нажатии кнопки «Отмена», я сделал следующее:

 cancel_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();  // Call this method to close the dialog
        }
 });

А для доступа к данным из дочерней активности (TextDialogActivity) в родительскую (MainActivity) активность я сделал то же самое, что и @Kemo, предложенное здесь в ответах. Это код:

// From Parent activity(MainActivity) opening popup on button click
popUpButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(getContext(), TextDialogActivity.class);
            startActivityForResult(intent, TEXTFILE);
        }
});

// From Child activity(TextDialogActivity) sending data to parent activity
save_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!secretText.isEmpty()) {
              Intent intent = new Intent();
              intent.putExtra("popup_data", secretText);
              setResult(RESULT_OK, intent);
              finish();
            }
        }
});

Теперь мне нужен результат от дочерней активности к родительской активности, потому что я сделал это в методе onActivityResult:

// In parent activity get data on onActivityResult
if (requestCode == TEXTFILE && resultCode == getActivity().RESULT_OK){
     secretText = data.getExtras().getString("popup_data", "");
}
person Jai Prak    schedule 30.01.2018