Я разрабатываю 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
. Я предполагаю, что первое нажатие меняет фокус, а второе нажимает. Если я удалю код, связанный с фокусом, ему потребуется только одно нажатие.
Есть ли лучший способ прокрутить представление до желаемого изображения или что-то другое, что я должен делать с фокусировкой?
onClickListener находится внутри для цикла, так как он создается для каждого ImageView, который создается в цикле. Не добавили бы focusLevel внутри цикла, создав его для каждого изображения? Кроме того, нажатие на изображение уже фокусирует его. Но мне все равно не нужно, чтобы это было сосредоточено. Я просто использовал requestFocus для прокрутки HorizontalScrollView до желаемого изображения. –
Правильно, наверное. Извините Скотта, я не уверен тогда – Ethan