0

Я разрабатываю Android-приложение для игры, и у меня есть HorizontalScrollView, который заполняется ImageViews. Каждый из ImageView доступен для выбора уровня, который вы хотите воспроизвести. Я использую SavedPreference, чтобы отслеживать последний воспроизводимый уровень и использовать это, чтобы определить, какое изображение находится на экране при загрузке меню. Таким образом, если вы находитесь на уровне 30, вам не нужно прокручивать все пути от уровня 1 каждый раз.setFocus() вызывает два нажатия для выбора imageview

Я использую requestFocus(), чтобы вывести на экран ImageView, и он отлично работает, за исключением двух относительно незначительных (но раздражающих) проблем.

Вот что я делаю по моему для цикла, который заполнит {HorizontalScrollView`:

 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

Почему бы вам просто не положить focusLevel внутри onClickListener? Таким образом, нажатие на изображение фокусирует его автоматически.

+0

onClickListener находится внутри для цикла, так как он создается для каждого ImageView, который создается в цикле. Не добавили бы focusLevel внутри цикла, создав его для каждого изображения? Кроме того, нажатие на изображение уже фокусирует его. Но мне все равно не нужно, чтобы это было сосредоточено. Я просто использовал requestFocus для прокрутки HorizontalScrollView до желаемого изображения. –

+0

Правильно, наверное. Извините Скотта, я не уверен тогда – Ethan

0

Итак, я не нашел пути для проблемы с двойным нажатием, когда элемент сфокусирован, но я обнаружил другое решение, которое работает для моей ситуации. Вместо того, чтобы использовать HorizontalScrollView с LinearLayout, я теперь внедрил ViewPager, который центрирует мои s для меня, а также позволяет мне прокручивать до пункта программно, используя setCurrentItem(). Мне вообще не нужно фокусироваться.

Для тех, кто ищет, чтобы сделать то же, пример Philipp здесь мне очень помог: How to implement a ViewPager with different Fragments/Layouts