У меня есть переменная в цикле, которую я меняю всякий раз, когда нажимаю на кнопку. Мне нужна эта переменная в самом конце упражнения для настройки вида, который должен отображать мой видоискатель. Все это началось, потому что я продолжал получать ошибку «не конечная переменная во внутреннем классе, определенном в другом методе». поэтому я искал здесь и сделал, как предлагали некоторые люди, - сделайте локальную конечную переменную, затем переназначьте ее в методе onTouch. Смотрите код ниже:
for(int categoryIndex = 0; categoryIndex <menuCategories.size(); categoryIndex++){
final CustomButton menuButton = new CustomButton(this);
menuButton.setId(ViewIdentification.getId());
menuButton.setText(menuCategories.get(categoryIndex).category_name);
menuButton.setTextColor(Color.argb(255, 77, 30, 16));
menuButton.setTextSize(35);
menuButton.setGravity(Gravity.CENTER);
menuButton.setTypeface(tf);
menuButton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
menuButton.setPadding(10, 10, 10, 10);
sideMenu.addView(menuButton);
final int currentCategoryIndex = categoryIndex;
menuButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
myCurrentCategory = currentCategoryIndex;
Log.d("Touched Side Menu button ", menuButton.getId() + ": " + menuButton.getText().toString());
Log.d("My Current Category is ", Integer.valueOf(myCurrentCategory).toString());
return false;
}
});
........
.......
.......building more stuff within this loop
В этом цикле я создаю массив LinearViews, который содержит несколько RelativeViews (которые, конечно, имеют любое количество представлений внутри). Так как у меня есть все эти LinearViews, я создал видоискатель, чтобы добавить все эти линейные представления, тогда в зависимости от того, что myCurrentCategory будет то, что я установил мой флиппер. См. Код ниже:
ViewFlipper flipper = new ViewFlipper(this);
RelativeLayout.LayoutParams viewFlipperLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
viewFlipperLayoutParams.addRule(RelativeLayout.RIGHT_OF, sideMenu.getId());
viewFlipperLayoutParams.setMargins(0, 0, 100, 0);
//subMenuLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, screenLayout.getId());
flipper.setLayoutParams(viewFlipperLayoutParams);
for(int flipperIndex = 0; flipperIndex < subMenuLinearLayouts.size(); flipperIndex++){
flipper.addView(subMenuLinearLayouts.get(flipperIndex));
}
//set which part of the menu we want to see
flipper.setDisplayedChild(myCurrentCategory);
Один subMenuLinearLayout - это LinearLayout с относительными разметками, у которых эти относительные разметки имеют другие представления (как я объяснил ранее, но хотелось бы прояснить).
Просто заметьте, что я определил myCurrentCategory в верхней части программы, поэтому он определен глобально. Когда я устанавливаю его в известные состояния 0,1,2,3,4,5, ViewFlipper правильно показывает мне правильный LinearLayout ... так что я знаю, что это работает. Однако внутри метода onTouch, где я назначаю новое значение myCurrentCategory на основе categoryIndex, ViewFlipper не переворачивается в это представление. Мои записи в журнале, которые у меня есть, показывают, что рассматриваемая переменная myCurrentCategory даже получает правильные значения. Я только что проверил это. Так что все сводится к тому, почему ViewFlipper не «видит» изменения в переменной? спасибо!