setFocus()导致两次推送选择imageview

时间:2015-01-26 19:00:26

标签: android imageview onclicklistener horizontalscrollview setfocus

我正在开发一款游戏Android应用,我的HorizontalScrollView正在填充ImageViews。每个ImageView都可以点击以选择您要播放的关卡。我使用SavedPreference跟踪上次播放的关卡,并使用它来确定加载菜单时屏幕上的图像。这样,如果您处于第30级,则不必每次都从第1级滚动。

我使用requestFocus()ImageView带到屏幕上,除了两个相对较小(但很烦人)的问题外,它运行正常。

以下是我在填充{Horizo​​ntalScrollView`的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。我假设第一次按下是改变焦点,第二次是点击。如果我删除与焦点相关的代码,则只需要按一下。

有没有更好的方法将视图滚动到所需的图像,或者我应该在聚焦时做些什么?

2 个答案:

答案 0 :(得分:0)

为什么不把focusLevel放在onClickListener内?这样点击图像会自动对焦。

答案 1 :(得分:0)

所以,当项目集中时,我还没有找到解决双重问题的方法,但我确实发现了一种适合我情况的不同解决方案。我没有将HorizontalScrollViewLinearLayout一起使用,而是现在实现了一个ViewPager,它为我ImageView提供了中心,并且还允许我滚动到使用setCurrentItem()以编程方式编写项目。我根本不必使用聚焦。

对于任何想要做同样事情的人来说,Philipp的例子对我有很大帮助:How to implement a ViewPager with different Fragments / Layouts