2013-08-22 2 views
1

Я хочу сделать нить, которая изменит макет моей деятельности ... У меня есть 2 макета: приветствие и активность_main ... Цель потока: когда я запускаю свое приложение, макет приветствия будет виден только 5 секунд, после чего макет снова будет activity_main ...setcontent view in thread

Я написал код, как показано ниже:

package com.example.tripolimazad; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    public TextView counter = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.welcomepage); 
     counter = (TextView) findViewById(R.id.Counter); 

     Thread th=new Thread(){ 
      @Override 
      public void run(){ 
       try 
       { 
          Thread.sleep(10000); 
          setContentView(R.layout.activity_main); 
       }catch (InterruptedException e) { 
       } 
      } 

     }; 
     th.start(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

, но он не работает !!! есть любое решение plz!

+6

вы должны смотреть на использование заставки вместо этого. –

ответ

2

Вы не можете изменить пользовательский интерфейс в потоке без пользовательского интерфейса, однако в Activity, вы можете использовать метод runOnUiThread:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     setContentView(R.layout.activity_main); 
    } 
}); 

Это кажется очень странным, хотя, чтобы иметь это в вашем onCreate.

+0

поблагодарить u @Phile .... это помогло много: D –

+1

@AhmadMoussa, рад, что я мог бы помочь. Не забудьте принять этот ответ (и получить репутацию +2)! – Phil

+1

да, конечно, я сделаю это :), но stackoverflow нужно 10 минут, чтобы принять мою acceptenece урского ответа ... я сделаю это (y) –

1

Вы также можете попробовать использовать CountDownTimer что-то вроде:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.welcomepage); 
    //display the logo during 5 secondes, 
    new CountDownTimer(5000,1000){ 
     @Override 
     public void onTick(long millisUntilFinished){} 

     @Override 
     public void onFinish(){ 
       //set the new Content of your activity 
       MainActivity.this.setContentView(R.layout.main); 
     } 
    }.start(); 
    //... 
} 

См Displaying logo for few seconds at application start больше.

0

Операции, связанные с UI, должны выполняться только в потоке пользовательского интерфейса и не должны выполняться в потоке, отличном от UI, как вы это делаете. Но вы можете обновить пользовательский интерфейс с не-UI нить следующим образом:

activityContext.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     setContentView(R.layout.activity_main); 
    } 
}); 

Однако лучший подход к ситуации вы упомянули это использовать задачу Async, предоставленную Android.You можно попробовать следующее:

/* 
* Activity/Thread to display the **welcomepage** 
* when the app is started. 
*/ 
public class SplashActivity extends Activity { 

    // how long until we go to the next activity 
    protected int _splashTime = 5000; // 5 seconds 

    // thread to display welcome page 
    private Thread splashTread; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.your_welcome_page_layout); 

     // thread for displaying the WelcomeScreen 
     splashTread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        synchronized (this) { 
         // wait 5 sec 
         wait(_splashTime); 
        } 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } finally { 
        // finish the current splashactivity 
        finish();     
        // start MainActivity as next activity 
        startActivity(new Intent(SplashActivity.this, MainActivity.class)); 
       } 
      } 
     }; 

     // start the thread. 
     splashTread.start(); 
    } 


} 
0

в качестве альтернативы вы можете использовать обработчик, чтобы избежать создания нового потока следующим образом:

getWindow().getDecorView().getHandler().postDelayed(new Runnable() { 
     @Override public void run() { 
      setContentView(R.layout.activity_main); 
     } 
    }, 10000);