2013-03-06 63 views
0

我的應用程序中實際上有3個活動。Android +開機畫面在方向改變時崩潰總數

我剛剛創建了一個活動並將其作爲使用處理程序的SPLASH SCREEN。

即,我的啓動畫面出現3秒,然後應用程序的主生命週期繼續。直到它完美無缺。

我的問題是當啓動畫面加載時,如果我改變方向,總的應用程序崩潰。

我的要求是以橫向和縱向模式加載應用程序。

我已經試過ONCONFIG變化等,但不成功....

我悲傷的故事包含了所有在這裏....

public class Asplash extends Activity{ 
Handler handler = new Handler(); 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 

    try { 

     handler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 


       finish(); 
       Intent i = new Intent(Asplash.this, Example.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
       startActivity(i); 
      } 
     }, 3000); 

    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 

} 




    @Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    handler.removeCallbacksAndMessages(null); 
     finish(); 
    super.onPause(); 

} 
} 

這裏是清單文件:

 <activity android:name=".Asplash" 
     android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 
     android:configChanges="orientation"> 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 


    <activity 
     android:name="com.example.Example" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

我只是想讓這個「Asplash」活動,以橫向和縱向出現。我也嘗試在佈局&佈局LAND文件夾中創建XML文件。然後也同樣恐慌...

其實在ANDROID,它應該自動調整ORIENTATION更改像基本示例中。但我不明白爲什麼它沒有在這裏工作......

+0

在這裏你去解決:[機器人:configChanges(http://stackoverflow.com/a/13116962/379693) – 2013-03-06 13:00:59

+0

完成()應該是最後 – 2013-03-06 13:16:12

+0

張貼錯誤日誌 – 2013-03-06 13:19:06

回答

4

使用此代碼:

public class Asplash extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 
     startLoading(); 
    } 
    //Start new activity and finish splash activity 
    public void openMainActivity() { 
     Intent i = new Intent(Asplash.this, Example.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
     startActivity(i); 
     finish(); 
    } 
    //Start thread which will wait for 3 secs and call openMainActivity 
    private void startLoading(){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(3000); 
       } catch (InterruptedException e) { 
       } 
       openMainActivity(); 
      } 
     }).start(); 
    } 
} 

完成()應該打開新的活動後打電話。並嘗試這個代碼,它會解決你的問題。您無需對清單進行任何更改。

+0

無論什麼方法,最後這種方法幫助我得到它,但我正在嘗試我的方法也謝謝VIJAY。 – sai 2013-03-06 13:37:27

0

嘗試把下面一個在你manifestactivity其中U遇到錯誤:

android:configChanges="orientation" 

正如Android Documentation說:

android:configChanges

列出activity將自行處理的配置更改。在運行時發生配置更改時,默認關閉並重新啓動activity,但使用此屬性聲明配置將會阻止該活動重新啓動。相反,activity仍然在運行並調用方法。

+0

@Bhuro看到我編輯的答案... – 2013-03-06 13:05:38

+0

不,我已經試過這個。同樣的結果。現在也是。 – sai 2013-03-06 13:07:02

+0

現在看來完整的答案。 – 2013-03-06 13:07:09

0

嘗試在Android清單文件中添加

android:configChanges="orientation|screenSize". 

但是,如果你的應用程序的目標API級別12或更低,那麼你的活動總是處理這樣的配置變化本身(此配置更改不重新啓動您的活動,甚至在Android 3.2或更高版本的設備上運行時)。

0

我並不完全確定在這種情況下,但是如果您展示的代碼是完整的,那麼您的Runnable的上下文在運行時已經消失了,因爲您的Activity已經在此期間被銷燬並重新創建改變方向。

活動創建 - >使用本身作爲上下文創建可運行 - >朝向的變化 - >活動被破壞 - >活動被創建 - >正在執行可運行 - >可運行的上下文對象無效

爲了解決這個問題在這個非常簡單的例子中,我認爲你可以使用Application對象作爲你的RUnnable的Context。

但是,請注意,您還有一個問題,即活動的重新創建會啓動另一個Runnable,它只會在稍後執行相同操作。

對於這種低複雜度場景,一個簡單的解決方案可能是在您的派生應用程序對象中存儲對Runnable的引用並檢查其是否存在。

0

嘗試把下面一個在你的清單針對你長了錯誤的活動:

android:configChanges="orientation" 

to the activity tag and then override onConfigurationChanged method and do something like this 

    public void onConfigurationChanged(Configuration newConfig) { 
     // TODO Auto-generated method stub 
     super.onConfigurationChanged(newConfig); 
     if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) 
     { 

        load your xml file for landscape 
} 


else 
{ 
load your xml file for potrait 
} 
+0

雅,我只是試過但沒有,沒有工作.... – sai 2013-03-06 13:19:58

+0

試圖保持佈局文件夾內的不同名稱的景觀文件 – 2013-03-06 13:22:05

+0

也調用setContentView與這些單獨的文件名,你必須保持兩個文件同名佈局和其他在佈局土地這種方式不會工作 – 2013-03-06 13:24:19