【问题标题】:How to stop multiple intents from opening sequentially?如何阻止多个意图按顺序打开?
【发布时间】:2019-11-11 18:45:23
【问题描述】:

我有一个显示在一个 Java 活动中的发票列表,并且我提供了单击其中一个发票以打开一个显示其详细信息的新活动的功能(使用意图)。问题是,新活动不会立即打开,如果用户在加载之前多次点击发票,它们都会被加载到屏幕上,用户必须退出所有这些。

我试图摆弄以解决此问题,但我不知道从哪里开始,我正在寻找某种功能,可以阻止任何点击执行任何操作,直到第一个加载完成。我将在下面包含我的方法的代码。

        final ListView listView = root.findViewById(R.id.invoices_list);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent showDetailedInvoice = new Intent(getActivity(), DetailedInvoiceActivity.class);
                try {
                    Invoice invoice = new Invoice(invoices.getJSONObject(position));
                    showDetailedInvoice.putExtra("invoice", invoice);
                    showDetailedInvoice.putExtra("user", user);
                    startActivity(showDetailedInvoice);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

【问题讨论】:

  • listView.setOnItemClickListener(null);
  • 我建议采取措施通过延迟查询(如果它们出于某种原因对 UI 线程造成压力)和昂贵的布局来立即打开活动(如果有的话)。在任何情况下,都应该可以使其响应足够快,以降低多次点击的风险。此外,您可以将活动标记为 singleTask 以使其作为单例工作:inthecheesefactory.com/blog/…

标签: java android android-fragments android-intent android-activity


【解决方案1】:

你有一些方法:

1- 用户单击一次后禁用项目,因此在活动出现之前他不能单击另一个项目(因此只允许一个)

2- 按时间控制点击次数,例如每秒一次。您将需要保存用户上次点击的时间并将当前时间与该时间进行比较,并检查至少经过一秒钟。活动可能会在 1 秒前打开。为此,您可以使用 System.currentTimeInMillis(),因此您将拥有如下内容:

private Long lastTimeUserClicked = null;

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Long clickTime = System.currentTimeInMillis();
    if(lastTimeUserclicked==null || clickTime - lasTimeUserClicked > 1000) { //1000 millisecs = 1 sec
      //Do your stuff ...
      lastTimeUserClicked = clickTime;   
    }
}

3- 如果您打开的活动只有一个并且您更改了其数据,您可以将意图设置为带有 Intent 标志的 SingleTop:

Intent showDetailedInvoice = new Intent(getActivity(), DetailedInvoiceActivity.class);

showDetailedInvoice.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)

注意:不确定您之前是否需要透明顶部。如果它不能仅与 SINGLE_TOP 一起使用,您可以尝试在之前添加

showDetailedInvoice.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2012-08-10
    • 2023-04-11
    • 2015-09-22
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多