我正在开发一款游戏Android应用,我的HorizontalScrollView
正在填充ImageViews
。每个ImageView
都可以点击以选择您要播放的关卡。我使用SavedPreference
跟踪上次播放的关卡,并使用它来确定加载菜单时屏幕上的图像。这样,如果您处于第30级,则不必每次都从第1级滚动。
我使用requestFocus()
将ImageView
带到屏幕上,除了两个相对较小(但很烦人)的问题外,它运行正常。
以下是我在填充{HorizontalScrollView`的for循环中所做的事情:
final ImageView iv = new ImageView(LevelSelect.this);
iv.setImageResource(levelImages[i]);
iv.setFocusable(true);
iv.setFocusableInTouchMode(true);
iv.setId(i);
LinearLayout ll= (LinearLayout)findViewById(R.id.levelSelectGallery);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(300, LinearLayout.LayoutParams.MATCH_PARENT);
我将其点击:
String str = getString(R.string.level) + i + getString(R.string.avail);
if (storage.getBoolean(str,false)) { //check if level is available (unlocked)
iv.setClickable(true);
final int finalI = i;
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.putInt(getString(R.string.Current_Level_savepreferences), finalI); //set current level to clicked image
Intent intent = new Intent(LevelSelect.this, LevelStart.class);
LevelSelect.this.startActivity(intent); // begin LevelStart activity
}
});
} else {
iv.setImageResource(lockedImages[i]); // show locked image
}
在循环之外,我设置焦点:
//check if there is a saved level
focusLevel = storage.getInt(getString(R.string.Saved_Level), 5);
//set focus on saved level
findViewById(focusLevel).requestFocus();
这会将焦点项目带到屏幕上,但只是在边缘。如果可能的话,我希望它能够集中在一起。我可以忍受这个。主要问题是,通过设置焦点,它现在需要在图像上按两次才能触发onClickListener
。我假设第一次按下是改变焦点,第二次是点击。如果我删除与焦点相关的代码,则只需要按一下。
有没有更好的方法将视图滚动到所需的图像,或者我应该在聚焦时做些什么?
答案 0 :(得分:0)
为什么不把focusLevel
放在onClickListener
内?这样点击图像会自动对焦。
答案 1 :(得分:0)
所以,当项目集中时,我还没有找到解决双重问题的方法,但我确实发现了一种适合我情况的不同解决方案。我没有将HorizontalScrollView
与LinearLayout
一起使用,而是现在实现了一个ViewPager
,它为我ImageView
提供了中心,并且还允许我滚动到使用setCurrentItem()
以编程方式编写项目。我根本不必使用聚焦。
对于任何想要做同样事情的人来说,Philipp的例子对我有很大帮助:How to implement a ViewPager with different Fragments / Layouts