【问题标题】:How to close custom dialog which itself is an activity and get data from it?如何关闭本身是活动的自定义对话框并从中获取数据?
【发布时间】:2018-01-29 13:15:26
【问题描述】:

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

这是截图。

【问题讨论】:

  • 你能说清楚你是否正在显示一个对话框,然后你想关闭对话框吗?
  • @Jai Prak 如果我理解正确,您想从父活动打开一个弹出窗口(这是一个活动),并从弹出窗口中的父活动访问数据?如果是这种情况,您将不得不使用意图。
  • 你可以创建一个扩展 Dailog 的对话框,而不是 Activity,你可以在那里做你的事情......你可以在该对话框中访问解除方法
  • @Kemo 是一样的。但我想从弹出窗口访问父活动的数据。
  • 添加截图后....只需将您的 AppCompactActivity 更改为 Dialog...并使用 'dismiss' 方法

标签: android android-dialog customdialog cancel-button


【解决方案1】:

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

您应该在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();
    }
});  

在父级中:

if (resultCode == RESULT_OK) { 
    ArrayList<String> popup_data= 
    data.getExtras().getStringArrayList("popup_data");
}

【讨论】:

  • 我想访问从弹出窗口到父活动的数据,而不是从父到弹出窗口。
  • 非常相似。使用意图将您的数据从弹出窗口发送到父活动,然后在父活动中使用 onActivityResult:public void onActivityResult(int requestCode, int resultCode, Intent data)
  • @JaiPrak 很高兴它有帮助:)
【解决方案2】:

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

但只需将 Dialog 作为 Activity 启动即可。

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

然后在主 Activity 中您会在 onActivityResult 中获得结果

查看example herehere

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

【讨论】:

    【解决方案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", "");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多