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

Я создал собственный диалог и хочу закрыть его при нажатии кнопки " Отмена". Я искал в 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>

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

3 ответа

Решение

Мой пользовательский диалог / всплывающее окно - это само действие. Я не использую 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", "");
}

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

Вы должны использовать dataIntent в 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");
}

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

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

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

Затем в основной деятельности вы получите результат в 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)
        }
    }
}
Другие вопросы по тегам