如何关闭本身是 activity 的自定义对话框并从中获取数据?
How to close custom dialog which itself is an activity and get data from it?
我已经创建了自定义对话框,我想在单击 取消 按钮时关闭它。我在 google 上搜索过,大多数人都在使用 Dialog 或 AlertDialog,但我没有使用类似的东西。这是我的 TextDialogActivity
,它在我的应用程序中单击按钮时加载。从 MainActivity
我只是将另一个 activity 渲染为自定义对话框。当我单击对话框上的 Save
按钮时,我想访问父 activity 中的数据,这些数据存储在子 activity 的变量 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>
这是截图。
您应该像对待其他任何东西一样对待它 activity。只需使用 intent 将您的数据从弹出 activity 发送到 parent activity。
您应该在 onActivityResult(int requestCode, int resultCode, Intent data)
中使用 data
Intent
,就像在弹出窗口中这样:
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();
}
});
在parent中:
if (resultCode == RESULT_OK) {
ArrayList<String> popup_data=
data.getExtras().getStringArrayList("popup_data");
}
如上所述,Activity 并不是最好的选择。
但只需将您的对话框作为 Activity 结果启动即可。
然后当用户按下一个按钮return结果并完成Activity。
然后在主要 Activity 中得到结果 onActivityResult
看到一个example here or
启动Activity(在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)
}
}
}
我的习惯 dialog/popup 本身就是 activity。我没有使用 Dialog 或 AlertDialog。为了在单击“取消”按钮时关闭此对话框,这就是我所做的:
cancel_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish(); // Call this method to close the dialog
}
});
为了访问从子 activity(TextDialogActivity
) 到父 (MainActivity
) activity 的数据,我做了与@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();
}
}
});
现在我想要从子 activity 到父 activity 的结果,因为我在 onActivityResult
方法中这样做了:
// In parent activity get data on onActivityResult
if (requestCode == TEXTFILE && resultCode == getActivity().RESULT_OK){
secretText = data.getExtras().getString("popup_data", "");
}
我已经创建了自定义对话框,我想在单击 取消 按钮时关闭它。我在 google 上搜索过,大多数人都在使用 Dialog 或 AlertDialog,但我没有使用类似的东西。这是我的 TextDialogActivity
,它在我的应用程序中单击按钮时加载。从 MainActivity
我只是将另一个 activity 渲染为自定义对话框。当我单击对话框上的 Save
按钮时,我想访问父 activity 中的数据,这些数据存储在子 activity 的变量 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>
这是截图。
您应该像对待其他任何东西一样对待它 activity。只需使用 intent 将您的数据从弹出 activity 发送到 parent activity。
您应该在 onActivityResult(int requestCode, int resultCode, Intent data)
中使用 data
Intent
,就像在弹出窗口中这样:
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();
}
});
在parent中:
if (resultCode == RESULT_OK) {
ArrayList<String> popup_data=
data.getExtras().getStringArrayList("popup_data");
}
如上所述,Activity 并不是最好的选择。
但只需将您的对话框作为 Activity 结果启动即可。
然后当用户按下一个按钮return结果并完成Activity。
然后在主要 Activity 中得到结果 onActivityResult
看到一个example here or
启动Activity(在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) } } }
我的习惯 dialog/popup 本身就是 activity。我没有使用 Dialog 或 AlertDialog。为了在单击“取消”按钮时关闭此对话框,这就是我所做的:
cancel_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish(); // Call this method to close the dialog
}
});
为了访问从子 activity(TextDialogActivity
) 到父 (MainActivity
) activity 的数据,我做了与@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();
}
}
});
现在我想要从子 activity 到父 activity 的结果,因为我在 onActivityResult
方法中这样做了:
// In parent activity get data on onActivityResult
if (requestCode == TEXTFILE && resultCode == getActivity().RESULT_OK){
secretText = data.getExtras().getString("popup_data", "");
}