0

アプリには実際に3つのアクティビティがあります。

アクティビティを作成し、ハンドラーを使用して 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」アクティビティを横向きと縦向きの両方で表示したいだけです。また、LAYOUT と LAYOUT-LAND の両方のフォルダに "splash" 用の XML ファイルを作成してみました。

実際、ANDROIDでは、基本的な例のように、ORIENTATIONの変更に合わせて自動的に調整されるはずですが、なぜここで機能しないのか理解できません...

4

5 に答える 5

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();
    }
}

新しいアクティビティを開いた後、finish() を呼び出す必要があります。そして、このコードを試して問題を解決してください。マニフェストに変更を加える必要はありません。

于 2013-03-06T13:06:39.300 に答える
0

エラーが発生manifestしたものの下に配置してみてください:activity

   android:configChanges="orientation"

Androidのドキュメントが言うように:

Android:configChanges :

が自身で処理する設定変更を一覧表示しますactivity。実行時に構成の変更が発生するactivityと、デフォルトで がシャットダウンされて再起動されますが、この属性を使用して構成を宣言すると、アクティビティが再起動されなくなります。代わりに、activity実行中のままで、そのonConfigurationChanged()メソッドが呼び出されます。

于 2013-03-06T12:58:37.293 に答える
0

エラーが発生したアクティビティのマニフェストに 1 つ下に配置してみてください。

   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
}
于 2013-03-06T13:07:48.790 に答える
0

Androidマニフェストファイルに追加してみてください

    android:configChanges="orientation|screenSize".

ただし、アプリケーションが API レベル 12 以下をターゲットにしている場合、アクティビティは常にこの構成変更自体を処理します (Android 3.2 以降のデバイスで実行されている場合でも、この構成変更によってアクティビティが再開されることはありません)。

于 2013-03-06T13:05:31.673 に答える
0

この場合、正確にはわかりませんが、表示するコードが完全である場合、ランナブルのコンテキストは実行されるまでになくなります。これは、方向の変更により、アクティビティが破棄され、その間に再作成されるためです。 .

アクティビティが作成されました -> それ自体をコンテキストとしてランナブルを作成します -> 向きの変更 -> アクティビティが破棄されます -> アクティビティが作成されます -> ランナブルが実行されています -> ランナブルのコンテキスト オブジェクトが無効です

この非常に単純なケースでこれを修正するには、Application オブジェクトを RUNnable のコンテキストとして使用できると思います。

ただし、別の問題があることに注意してください。つまり、Activity を再作成すると別の Runnable が開始され、後で同じことが行われます。

この複雑さの低いシナリオの単純な解決策は、派生した Application オブジェクトに Runnable への参照を格納し、その存在を確認することです。

于 2013-03-06T13:06:38.073 に答える