0

画面の向きが変更された後、バックグラウンド スレッドが textView( txtName )の内容を変更できない理由を理解できません。

txtnameを静的にすると機能しますが、静的にしないと機能しません。バックグラウンドスレッドによって更新されない初期値があります。

private TextView txtName;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen2);

    txtName = (TextView) findViewById(R.id.txtName);
    TextView txtEmail = (TextView) findViewById(R.id.txtEmail);
    Button btnClose = (Button) findViewById(R.id.btnClose);

    Button btnBack = (Button) findViewById(R.id.btnBack);

    Intent i = getIntent();
    // Receiving the Data
    String name = i.getStringExtra("name");
    String email = i.getStringExtra("email");
   // String data = i.getStringExtra("data");
    // Displaying Received data
    txtName.setText("HI");
    txtEmail.setText(email);

    // Binding Click event to Button
    btnClose.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
              //Closing SecondScreen Activity
              Thread background = new Thread(new Runnable() {
                   @Override
                   public void run() {
                    for (int i = 0; i < 30; i++) {
                     try {
                      Thread.sleep(1000);
                      Message msg = new Message();
                      Bundle b = new Bundle();
                      b.putString("My Key", "My Value: " + String.valueOf(i));
                      msg.setData(b);
                      // send message to the handler with the current message handler
                      handler.sendMessage(msg);
                      Log.e("Error", "IN THREAD");
                      } catch (Exception e) {
                      Log.d("Error", e.toString());
                     }
                    }
                   }
              });
              background.start();
        }
    });


    btnBack.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
             Intent returnIntent = getIntent();
             returnIntent.putExtra("returnResult","i want to back page.");
             setResult(RESULT_OK,returnIntent);
             finish();

        }
    });



}








Handler handler = new Handler() {

      public void handleMessage(Message msg) {
       // get the bundle and extract data by key
       Bundle b = msg.getData();
       String key = b.getString("My Key");
       txtName.setText( "Item " + key);
       txtName.setVisibility(View.VISIBLE);
       Log.e("TEST MESSAGE",  txtName.getText().toString());
      }

     };
4

3 に答える 3

0

OnClickListener を固定クラスとして作成し、次のように適用します。

MyListener myListener = new MyListener();

btnClose.setOnClickListener(myListener);

このように、txtName変数を final として設定してはなりません

于 2013-07-28T22:07:33.243 に答える
0

UI は、UI スレッドによってのみ更新できます。このようなことを試して、UI スレッドにできるだけ早くインターフェイスを更新するように依頼してください。このようにして、ハンドラーの使用を避けることができると思います。

btnClose.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
              //Closing SecondScreen Activity
              Thread background = new Thread(new Runnable() {
                   @Override
                   public void run() {
                    for (int i = 0; i < 30; i++) {
                     try {
                      Thread.sleep(1000);
                      final String val = "My Value: " + String.valueOf(i);
                      // ask UI thread to make the changes as soon as possible
                      txtName.post(new Runnable(){
                     public void run(){
                              txtName.setText( "Item " + val);
                              txtName.setVisibility(View.VISIBLE);
                         });
                      } catch (Exception e) {
                      Log.d("Error", e.toString());
                     }
                    }
                   }
              });
              background.start();
        }
    });
于 2013-07-28T22:08:20.983 に答える
0

runOnUiThread を試してください:

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 

    Handler handler = new Handler() {
      public void handleMessage(Message msg) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 // get the bundle and extract data by key
                 Bundle b = msg.getData();
                 String key = b.getString("My Key");
                 txtName.setText( "Item " + key);
                 txtName.setVisibility(View.VISIBLE);
                 Log.e("TEST MESSAGE",  txtName.getText().toString());
             }
         });
      }
   };
} 
于 2013-07-27T12:17:18.703 に答える