【问题标题】:Why variable gets reset on button click(s) in Android?为什么变量会在 Android 中的按钮单击时重置?
【发布时间】:2022-01-12 14:50:17
【问题描述】:

有人可以帮助我了解这里发生了什么吗?一直在尝试调试,但感觉卡住了!

我正在尝试使用以下方法在我的 Android 应用中为一些在线图像制作动画。

private void animateImages() {
 
        // URL loading
        // int i = 1; (initialized earlier)
        // ArrayList<String> myImages = new ArrayList<>(); (initialized earlier)
        myImages.clear();
        While (i < 11) {
        // Adds ten images using web link
        myImages.add("My_web_url");
        i++;
        }            

        AccelerateInterpolator adi = new AccelerateInterpolator();
        try {
            Field mScroller = ViewPager.class.getDeclaredField("mScroller");
            mScroller.setAccessible(true);
            mScroller.set(viewPager, new MyScroller(getApplicationContext(), adi, 1));
        }
        catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
 
        if (viewPager != null) {
            viewPager.setAdapter(new MyPageAdapter(getApplicationContext(), myImages));
        }
 
        final Handler handler = new Handler();
        final Runnable Update = new Runnable() {
            // Printing variables for debugging 
            System.out.println("The page number is=" + currentPage);
            System.out.println("The myImages size is=" + myImages.size());
            
            public void run() {
                if (currentPage == myImages.size() - 1) {
                    currentPage = 0;
                }
                viewPager.setCurrentItem(currentPage++, true);
            }
        };
 
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.post(Update);
            }
            // delay and period can be initialized as desired
        }, delay, period);
    }
 
}

当我在OnCreate 中调用此方法时,动画效果很好。但是,当我在OnClickButton Listener 中调用此方法时,变量myImages 的大小(public void run() 之前)变为零,并且由于此动画不起作用。

在上面,MySCrollerMyPageAdapeter 是 java 类。但是,这个问题很可能与按钮单击有关,我不明白为什么它会重置 myImages 大小从而停止动画!

这就是按钮点击监听器的调用方式。我做错了什么?

MyButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        animateImages();
    }
});

编辑 1:

感谢各位cmets,我进步了一点。

我将所有这些变量从 MainActivity 移到 animateImages() 方法。动画也可以通过单击按钮来运行,但是动画中有一个凹凸,其中图像移动得太快然后出现凹凸等等..

// Added just before while loop
DELAY_MS = 1000;
PERIOD_MS = 1000;
i = 1;
currentPage = 0;

如果我将 URL 加载 while 循环移动到 OnCreate(),我会注意到相同的动画凸起。

【问题讨论】:

  • While (i &lt; 11) { i 在哪里声明?它在哪里修改?
  • 放入runOnUiThread(){}
  • @Michael:在public class MainActivity extends AppCompatActivity {....} 之后和OnCreate 之前,所有变量都已初始化
  • 好吧,从你发布的代码中我不清楚 while-loop 应该如何工作,因为你没有向我们展示 i 的修改位置。跨度>
  • 第二次调用它会清除myImages,但不会循环,因为i 未重置。将该列表的创建移至 onCreate。

标签: java android android-button


【解决方案1】:

第二次调用animateImages 时,它会清除myImages,但随后不会循环,因为i 未重置,因此它保持为空。将该列表的创建移至 onCreate 以避免该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多