【问题标题】:Android - How would I access a variable within the onTouch method for use in ViewFlipperAndroid - 我将如何访问 onTouch 方法中的变量以在 ViewFlipper 中使用
【发布时间】:2012-03-15 09:31:57
【问题描述】:

我在一个循环中有一个变量,每当我触摸一个按钮时我都会改变它。我需要在活动的最后使用这个变量来设置我的 viewflipper 显示哪个视图。整个事情的开始是因为我不断收到“在不同方法中定义的内部类中的非最终变量”错误。所以我在看这里并按照一些人的建议做了 - 制作一个本地最终变量,然后在 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 

在这个循环中,我正在构建一个包含多个相对视图的线性视图数组(其中当然有任意数量的视图)。由于我拥有所有这些 LinearView,因此我创建了一个 viewflipper 来添加所有这些线性视图,然后取决于 myCurrentCategory 是什么,我将我的 Flipper 设置为。请参阅下面的代码:

    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 ......所以我知道这是有效的。但是,在我根据 categoryIndex 为 myCurrentCategory 分配新值的 onTouch 方法中,ViewFlipper 不会翻转到该视图。我的日志语句表明有问题的 myCurrentCategory 变量甚至获得了正确的值。我刚刚测试过了。所以归结为为什么 ViewFlipper 没有“看到”变量的变化?谢谢!

【问题讨论】:

    标签: android viewflipper touch-event


    【解决方案1】:

    您应该在onTouch 的日志消息中获得正确的输出。但是您的 ViewFlipper 应该如何知道您只是更改了变量的内容(onTouch 会在未来的某个随机点发生)?

    你需要调用onTouch中的一些方法(例如flipper.setDisplayedChild)才能看到一些东西。

    所以归结为为什么 ViewFlipper 没有“看到”变量的变化?谢谢!

    Java / ViewFlipper 不会因为您在某个时候使用过该变量而为您监控变量。事实上,代码甚至不知道你使用了什么变量。它只是获得了一个新的价值。

    【讨论】:

    • 活动中的所有内容不是不断刷新吗?我想,因为每个活动中的每个动作/视图/总是在等待响应 - 所以我假设(显然错误地)当未来发生变化时,所有 set 方法(如 set(variableName))都会在下一次刷新时发生变化。我希望这是有道理的。我会尝试你的建议,我会回来回复。
    • 变量本身应该正确更新,我认为我们怀疑的是您是否再次正确执行 ViewFlipper 代码。但我不认为,如果没有完整的活动代码,我们就无法判断。至少是 ViewFlipper 相关的代码。
    • 我在脚蹼代码中添加了额外的代码 - 它位于活动的最底部,我将所有部分放在一起,然后再将它们设置到屏幕上。在使用 onTouch 的循环之外。
    • 好吧,我觉得自己很愚蠢。我一直认为一个活动是完全线性的。在这种情况下,我在 viewflipper 中添加了所有构建的视图,但我想当我编写代码时,我的心态是它不知道我已经添加了哪些视图。所以我按照zapi的建议做了。再次感谢您的帮助。
    • 有一些线性部分,例如onCreateonResume之前执行等等。但是一旦onResume 完成,App 就会暂停并等待事件发生。要处理所有这些,您拥有这些 onTouchonClick 和其他 onEvent 处理程序。每当 Android 检测到此类事件时,就会执行您放入其中的代码。你的任务是告诉 UI 你想要改变一些东西。否则它不起作用:例如,采用 int 的方法无法看到您对该变量所做的更改,因为该方法获取了该值的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多