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()上的进度条值。如果我早点停止任务,我只是希望能够早点关闭该栏。
答案 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}修饰符。
但是,static
是findViewById()
上的一个实例方法(请参阅上面的链接),这可能是您Activity
类的祖先。静态方法无法静态调用实例方法,因此即使您让Eclipse使Whatever
为静态,也需要在活动的实例上调用clipProgress
。
您的其他类需要引用您要调用clipProgress
的类的实例。您应该将该引用传递给另一个类,或者如另一个提到的海报,传递对clipProgress()
本身的引用。
然后你可以打电话给ProgressBar
或mWhatever.clipProgress()
。