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

时间:2018-01-29 13:15:27

标签: android android-dialog customdialog cancel-button

我创建了自定义对话框,我想在取消按钮点击时将其关闭。我在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
          }
      });

   }
 }

我在{strong> AndroidManifest.xml 中添加了@style/Theme.AppCompat.Dialog来进行对话。

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

这是截图。

3 个答案:

答案 0 :(得分:1)

您应该将此视为任何其他活动。只需使用intent将数据从弹出活动发送到父活动。

您应该在弹出窗口中使用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");
}

在父母:

writeMsg()

答案 1 :(得分:0)

如上所述,活动并不是最好的。

但是,只需将对话框作为结果的活动开始。

然后当用户按下按钮返回结果并完成活动时。

然后在主Activity中,您将获得onActivityResult

中的结果

查看example herehere

启动活动(在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)
        }
    }
}

答案 2 :(得分:-1)

我的自定义对话框/弹出窗口是活动本身。我没有使用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", "");
}