-1

我花了几个小时试图更新对话框中的文本视图,但失败了。Android更新内部对话框中的TextView runOnUiThread

当单击该选项时,会显示新的对话框,并且在对话框中有文字和按钮,当我单击按钮时,textview将被更新。

这里是与按钮的onClick监听器代码:

start.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       for (int i = 0; i < 50 ; i ++){ 

        final String currentNum = String.valueOf(i + 1); 

        Thread t = new Thread() { 
          @Override 
          public void run() { 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            try { 
            Thread.sleep(1000); 
           } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
            System.out.println(currentNum); //it is fine 
            currentNum.setText(currentNum); //it is the problem, the setText only work when the for loop is finished. 
           } 
          }); 
          } 
         }; 

         t.start(); 

       } 
      } 
     }); 

请让我知道如果你需要更多的信息。提前感谢!

//这是一个optionmenu

case R.id.action_refresh: 
    final TextView currentNum; 
    final ImageButton start; 

    String currentNum = Integer.toString(songList.size()); 

    final Dialog lyricsAnalysis = new Dialog(this,R.style.cust_dialog); 
    lyricsAnalysis.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    lyricsAnalysis.setContentView(R.layout.analysis); 
    lyricsAnalysis.setCancelable(true); //back button to cancel 
    lyricsAnalysis.setCanceledOnTouchOutside(true); 


    start = (ImageButton) lyricsAnalysis.findViewById(R.id.start); 

    //first value 
    currentNum.setText(String.valueOf(currentNum)); 

    start.setOnClickListener(new OnClickListener() { 


     @Override 
     public void onClick(View arg0) { 
      for (int i = 0; i < 50 ; i ++){ 

       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       updateTextView(lyricsAnalysis,i); 

      } 
     } 
    });  
    lyricsAnalysis.show(); 
    lyricsAnalysis.getWindow().setLayout(600, 1000); 
    break; 
} 
return super.onOptionsItemSelected(item); } 
public void updateTextView(Dialog dialog, int i) { 
    final TextView currentNum = (TextView) dialog.findViewById(R.id.currentNum); 
    currentNum.setText(Stri`enter code here`ng.valueOf(i)); 
    //return; 
} 
+0

能否请你告诉我有螺纹的目的在onClick方法中? – Srinivasan 2015-03-31 05:25:33

+0

这里避免使用线程有什么用处。 – 2015-03-31 05:26:03

+0

就像我虽然没有新的线程,textView将不会每次更新。当for循环结束时将会更新它。 我所尝试的是,System.out.println(currentNum)很好,它打印出0到49,但是,setText只有在for循环完成并直接将textView更改为(50)时才起作用... – andy 2015-03-31 06:50:17

回答

0

尝试此方法。这可能会帮助你。这是为我工作。(但我不是在对话框中使用)

public void updateTextView(String toThis) { 

    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText(toThis); 

    //return; 
} 
+0

与上面的方法相同的结果,当for循环完成时,setText将被改变。为什么:( – andy 2015-03-31 06:53:49

+0

你在哪里初始化'currentNum'?你能显示完整的对话框代码吗? – Vijay 2015-03-31 07:04:47

+0

我刚刚添加了在上完整的对话框代码,感谢 – andy 2015-03-31 07:25:22

0

尝试这样

int elapsedtime=0; 
    boolean isTimerRunning=false; 

Timer timerr; 

里面的onCreate

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    //declare your textview here; 
    timerr=new Timer(); 
       startTimer(); 
} 

    /* 
    * timer for displaying message bubble 
    */ 
    protected static void startTimer() { 
     isTimerRunning = true; 
     elapsedtime = 0; 
     // recordingseek.setProgress(0); 

     timerr.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

       // increase every sec 

elapsedtime++; 


        mmHandler.obtainMessage(1).sendToTarget(); 
        System.out.println("recording time" + elapsedtime); 

       if(elapsedtime==50) 
         timerr.cancel(); 


      } 
     }, 1000, 2000); 
    }; 

    public static Handler mmHandler = new Handler() { 

     public void handleMessage(Message msg) { 



      textview.setText(elapsedtime); 



} 
    }; 




    } 
}; 
+0

我用你的代码,此外,添加 尝试{ \t \t \t \t \t \t \t Thread.sleep(1000); \t \t \t \t \t \t}赶上(InterruptedException的发送){ \t \t \t \t \t \t \t // TODO自动生成的catch程序块 \t \t \t \t \t \t \t e.printStackTrace(); \t \t \t \t \t \t} 和 “currentNum.setText(currentNum);”仅当I = 50时才有效... – andy 2015-03-31 06:42:49