Как закрыть пользовательский диалог, который сам по себе является активностью, и получить от него данные?
Я создал собственный диалог и хочу закрыть его при нажатии кнопки " Отмена". Я искал в 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", "");
}
Вы должны относиться к этому как к любому другому виду деятельности. Просто используйте намерение, чтобы отправить ваши данные из всплывающей активности в родительскую активность.
Вы должны использовать 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");
}
Как уже упоминалось выше, активность не является лучшим для этого.
Но просто начните диалог как занятие для результата.
Затем, когда пользователь нажимает кнопку, верните результат и завершите действие.
Затем в основной деятельности вы получите результат в 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) } } }