Android - Как мне получить доступ к переменной в методе onTouch для использования в ViewFlipper - PullRequest
0 голосов
/ 15 марта 2012

У меня есть переменная в цикле, которую я меняю всякий раз, когда нажимаю на кнопку. Мне нужна эта переменная в самом конце упражнения для настройки вида, который должен отображать мой видоискатель. Все это началось, потому что я продолжал получать ошибку «не конечная переменная во внутреннем классе, определенном в другом методе». поэтому я искал здесь и сделал, как предлагали некоторые люди, - сделайте локальную конечную переменную, затем переназначьте ее в методе 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 не «видит» изменения в переменной? спасибо!

1 Ответ

1 голос
/ 15 марта 2012

Вы должны получить правильный вывод в сообщении журнала в onTouch.Но как ваш ViewFlipper должен знать, что вы только что изменили содержимое переменной (onTouch произойдет в какой-то случайной точке в будущем)?

Вам нужно вызвать некоторый метод в onTouch (например, flipper.setDisplayedChild), чтобыувидеть что-то.

Итак, все сводится к тому, почему ViewFlipper не «видит» изменения в переменной?спасибо!

Java / ViewFlipper не контролирует переменные за вас только потому, что вы использовали эту переменную в какой-то момент.На самом деле код даже не знает, какую переменную вы использовали.Он просто получает новое значение.

...