如何关闭本身是 activity 的自定义对话框并从中获取数据?

How to close custom dialog which itself is an activity and get data from it?

我已经创建了自定义对话框,我想在单击 取消 按钮时关闭它。我在 google 上搜索过,大多数人都在使用 DialogAlertDialog,但我没有使用类似的东西。这是我的 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", "");
}