findViewById(R.id.progressbar)和静态地狱:

时间:2011-10-25 01:54:36

标签: java android

clipProgress将进度条重置为零:

public class Whatever extends Activity implements ListenerA, ListenerB {
        private Handler mHandler = new Handler();

        ProgressBar myProgressBar;  
        int myProgress = 0;  

        public void clipProgress() {
            myProgressBar = (ProgressBar)findViewById(R.id.progressbar);  
            myProgressBar.setProgress(myProgress);  
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            clipProgress();

            public void onClick(View view) {
                Duration.duration = 0;
                startRecording();

                new Thread(new Runnable(){  
                    @Override  
                    public void run() {  
                        while(myProgress<100){  
                            try{  
                                myHandle.sendMessage(myHandle.obtainMessage());  
                                Thread.sleep(50);  
                            }catch(Throwable t){  
                            }  
                        }  
                    }  
                }).start();  
            }

        Handler myHandle = new Handler(){  
            @Override  
            public void handleMessage(Message msg) {  
                myProgress++;  
                myProgressBar.setProgress(myProgress);  
            }  
        };
    });
}

我有两种不同的方法,我想我可以尝试将进度条重置为零。但他们都完全属于不同的阶层:

@Override   protected void onPostExecute(Void result) {  
    Whatever.clipProgress();  //...which throws all kinds of red lines if I use this statement.
}

public void stopThis(){
    thing.stop();
    try {
        Whatever.clipProgress();  //...which throws all kinds of red lines if I use this statement.

        dos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Eclipse希望将“static”应用于Whatever类中的各种初始化。但是那些修复只是让findViewById(R.id.progressbar)更新。

我只想重置第2课的进度条(从1级开始)。要求的内容太多了。

更新 无论什么是起点,Android Activity。它的处理程序,我应该包含在上面的剪辑中,正好在onCreate下面,包含在下面的剪辑中。因此,更完整,并从按钮调用,是:

        public void onClick(View view) {
            new Thread(new Runnable(){  
                @Override  
                public void run() {  
                    while(myProgress<100){  
                        try{  
                            myHandle.sendMessage(myHandle.obtainMessage());  
                            Thread.sleep(87);  
                        }catch(Throwable t){  
                        }  
                    }  
                }  
            }).start();  
        }

        Handler myHandle = new Handler(){  
            @Override  
            public void handleMessage(Message msg) {  
                myProgress++;  
                myProgressBar.setProgress(myProgress);  
            }  
        };

按下该按钮后,会产生一个监听器:

    myTask = new Task();
    myTask.addTaskListener(this);
    myTask.execute(this);

它在Task类中:

public class Task extends AsyncTask<Whatever, ArrayList<Float>, Void>{
...
    public void addTaskListener(TaskListener rl){
        this.rl = rl;
    }
...

这两个函数驻留,其中一个我希望用来停止进度条。

任务在其他地方被设计为以完全恒定的秒数关闭,因此我可以将50硬编码到sleep()上的进度条值。如果我早点停止任务,我只是希望能够早点关闭该栏。

2 个答案:

答案 0 :(得分:2)

Eclipse警告您,因为您以静态方式访问clipProgress方法(通过调用Whatever.clipProgress())。

此外,您只应分配一次进度条,因此请移动

myProgressBar = (ProgressBar)findViewById(R.id.progressbar);

进入onCreate方法。

您应该将ProgressBar传递给需要更新它的其他类,然后执行类似

的操作
myProgressBar.post(new Runnable() {
    public void run() {
        myProgressBar.setProgress(myProgress);
    }
});

post方法更新UI线程上的ProgressBar,这是唯一安全的方法。如果ProgressBar的活动当前处于活动状态,请确保您只是执行此操作。

您还应该质疑是否需要更新此其他课程中的进度条。我只看到你更新了处理程序中的myProgress变量,在那里你立即在栏上设置了进度。你能用进度条解释一下这个其他课与活动之间的关系吗?

答案 1 :(得分:1)

这与Java编程和instance / static methods有关,而与Android有关:

当你调用Whatever.clipProgress()时,你试图调用clipProgress类上Whatever的静态方法调用,这就是为什么Eclipse要添加{{1}修饰符。

但是,staticfindViewById()上的一个实例方法(请参阅上面的链接),这可能是您Activity类的祖先。静态方法无法静态调用实例方法,因此即使您让Eclipse使Whatever为静态,也需要在活动的实例上调用clipProgress

您的其他类需要引用您要调用clipProgress的类的实例。您应该将该引用传递给另一个类,或者如另一个提到的海报,传递对clipProgress()本身的引用。

然后你可以打电话给ProgressBarmWhatever.clipProgress()