onClick错误地启动活动(在2.3.6中)

时间:2012-07-08 06:54:39

标签: android android-activity

我正在开发一个提供一组多个Button对象的接口,每个对象都附加了相同的OnClickListener。点击上述Button后,他们应按Activity中的说明启动onClick

以下是我的参考代码:

public class Calcs extends SherlockFragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // ...

        CalcLoader buttonListener = new CalcLoader(getActivity());
        LinearLayout buttons = (LinearLayout) v.findViewById(R.id.calculatorlist); // v is the inflated View
        for (int i = 0; i < buttons.getChildCount(); i++) {
            View b = buttons.getChildAt(i);
            if (b instanceof Button) {
                ((Button) b).setOnClickListener(buttonListener);
            }
        }

        // Test Code: Location 1
        Intent i = new Intent(getActivity(), MyCalcActivity.class);
        getActivity().startActivity(i);

        // ...
    }

    private class CalcLoader implements OnClickListener {
        private Activity mOwner;

        public CalcLoader(Activity owner) {
            mOwner = owner;

            // Test Code: Location 2
            Intent i = new Intent(mOwner, MyCalcActivity.class);
            mOwner.startActivity(i);
        }

        public void onClick(View v) {
            if (v instanceof Button) {
                // Actual Code: Location 3
                Intent i = new Intent(mOwner, MyCalcActivity.class);
                mOwner.startActivity(i);
            }
        }
    }
}
然而,尽管如此,我还是有些奇怪的行为。在上面的代码中,我放置了一些startActivity测试,标记为位置1和2.在这两种情况下,Activity正确启动,一切都很好!

但是,在工作代码应该执行的位置3,我从启动的Activity获得了一些奇怪的行为:

  • 首先,Activity发布得很好。它会显示一个文本字段,并且会聚焦,软键盘会出现。这是对的。
  • 现在,当我点击后退按钮时,键盘会关闭。这是对的。
  • 再次单击返回,该字段失去焦点。这不应该发生。相反,Activity应该关闭并返回上一个。
  • 再次点击返回,整个应用关闭(而不是返回上一个Activity)。显然,这不应该发生。

重申一下,当{1}}从位置1或2开始时,一切正常;后堆栈是正确的,并正确返回到初始Activity

这里出了什么问题?为什么,当我从Activity开始Activity时,它是否会失败,而它可以在任何其他位置运行?

更新:在构造函数中保存onClick并在Intent方法中重复使用会产生相同的glitched结果,就像从onClick开始一样UI线程。

第二次更新:使文字字段无法调整对故障没有影响;后退按钮仍然关闭应用程序。此外,在2.3.3仿真器中运行具有相同的结果。奇怪的是,在按下第二个按钮后(文本字段失去焦点),如果等待~3秒,Activity将关闭并返回主要按钮。

第三次更新:对于从文本字段获取焦点的后退按钮,不会触发任何键事件(ActivityonKeyDown)。此外,如果在文本字段失去焦点后与onBackPressed进行交互,则会显示加载相同类型的新Activity的动画,但此处也存在毛刺。

这似乎是操作系统级问题,可在Android 2.2(API 8),2.3.1(API 9)和2.3.3(API 10)中找到。 Eclair(API 7)和API 11+没有此问题。在这一点上,我相信我正在寻找某种解决方法......

1 个答案:

答案 0 :(得分:0)

原来我的问题不是由我在原帖中详述的内容引起的,所以我为此道歉。

问题是由与我正在测试的标签无关的标签上的SurfaceView项引起的。在从头开始重建标签和布局(并且每次都建立)之后,我发现只有在非焦点标签中出现SurfaceView时才会出现滞后故障。

我终于找到了I was not the only one with this issue

要解决:

  • 在主onPause中创建了Activity方法。在这里,我使用SurfaceView
  • 销毁container.removeView(..);
  • 在主onResume中创建了Activity方法。在这里,我从仅包含SurfaceView项的新XML文件中提取SurfaceView,并将其添加到原始container
  • 最后,在android.view.SurfaceHolder.Callback中实施SurfaceView以删除表面内容。

它让我觉得这只发生在API 8-10上,但我很高兴它现在已经解决了。感谢所有提供帮助的人!