Я разрабатываю игровое приложение для Android, и у меня есть HorizontalScrollView
, который заполняется ImageViews
. Каждый ImageView
можно щелкнуть, чтобы выбрать уровень, на котором вы хотите играть. Я использую SavedPreference
для отслеживания последнего сыгранного уровня и использую его для определения того, какое изображение отображается на экране при загрузке меню. Таким образом, если вы находитесь на уровне 30, вам не нужно каждый раз прокручивать весь путь от уровня 1.
Я использую requestFocus()
, чтобы вывести ImageView
на экран, и он работает нормально, за исключением двух относительно незначительных (но раздражающих) проблем.
Вот что я делаю в своем цикле for, который заполняет { 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
. Я предполагаю, что первое нажатие меняет фокус, а второе — щелчок. Если я удалю код, связанный с фокусом, для этого потребуется всего одно нажатие.
Есть ли лучший способ прокрутить вид до нужного изображения или что-то другое, что я должен делать с фокусировкой?