我正在开发一个提供一组多个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
将关闭并返回主要按钮。
第三次更新:对于从文本字段获取焦点的后退按钮,不会触发任何键事件(Activity
或onKeyDown
)。此外,如果在文本字段失去焦点后与onBackPressed
进行交互,则会显示加载相同类型的新Activity
的动画,但此处也存在毛刺。
这似乎是操作系统级问题,可在Android 2.2(API 8),2.3.1(API 9)和2.3.3(API 10)中找到。 Eclair(API 7)和API 11+没有此问题。在这一点上,我相信我正在寻找某种解决方法......
答案 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上,但我很高兴它现在已经解决了。感谢所有提供帮助的人!