0

これが私の考えです。Androidでアクティビティのようなコンポーネントを作成したいので、このようにして、アクティビティから派生したスプラッシュアクティビティから派生したメインアクティビティを作成し、スプラッシュアクティビティでライセンスを確認したいと思います。利用可能な場合、スプラッシュ アクティビティから派生したメイン アクティビティにリダイレクトしたいと考えています。

私の全体的な考えは、コンポーネントを持っているので、それをメインアクティビティから拡張することで、すべてを自動化する必要があります。

次のコードを使用してこの使用を行いましたが、スムーズに機能しておらず、私のアプローチに何か問題があると確信しています:

//my main activity which will be shown after splash screen
public class MyActivity extends SplashLoader
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.setNextActivity(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText("hello");

    }
}

//my splash activity

public class SplashLoader extends Activity
{
    private static final String ERROR_MESSAGE = "Error message";
    private  Activity nextActivity=null;

    public Activity getNextActivity() {
        return nextActivity;
    }

    public void setNextActivity(Activity nextActivity) {
        this.nextActivity = nextActivity;
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        LinearLayout lLayout = new LinearLayout(this);
        lLayout.setOrientation(LinearLayout.VERTICAL);
        lLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        ImageView iv = new ImageView(this);
        iv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        iv.setImageResource(R.drawable.logo);
        lLayout.addView(iv);
        setContentView(lLayout);

boolean isRegistered = false;
        if(!isRegistered)
        {
            createDialog().show();
        }
        else
        {
        //    finish();
            Intent intent = new Intent(SplashLoader.this,getNextActivity().getClass());
            startActivity(intent);

        }
    }



    private AlertDialog.Builder createDialog()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);


        DialogInterface.OnClickListener clickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int which)
            {
                switch (which)
                {
                    case DialogInterface.BUTTON_NEUTRAL:
                        System.exit(0);
                        break;
                    default:
                        break;
                }

            }
        } ;

        builder.setMessage(ERROR_MESSAGE).setNeutralButton("Ok" ,clickListener );
        return builder;
    }
}

//and my manifest 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:label="@string/app_name">
        <activity android:name="MyActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

編集:

このアプローチによるエラーはありませんが、スプラッシュが mainActivity を読み込もうとした後、遅延が発生するか、方向を変更した後に mainActivity が表示されます。このアプローチの動作は少し独特です。

4

1 に答える 1

0

MainActivity.onCreate()あなたが呼んでいますsuper.onCreate()MainActivityはこれから派生するため、SplashLoader最終的に が呼び出されSplashLoader.onCreate()ます。ビューをインSplashLoader.onCreate()フレートし、setContentView() を呼び出します。次に、MainActivity.onCreate()でもう一度実行します (これにより、 で行ったすべての作業が上書きされますSplashLoader.onCreate())。ビューの拡張には時間 (およびリソース) がかかり、これが目に見える遅延の一部を生成している可能性があります。また、SplashLoader.onCreate()startActivity() を呼び出して を開始します。MainActivityこれは、 のときに再び行われMainActivity.onCreate() calls super.onCreate()ます。

MainActivityから拡張するようなことを本当にしたい場合はSplashLoader、ライフサイクルのオーバーライドが機能する方法を修正する必要があります。おそらく次のようなことをする必要があります:

SplashLoaderで:

@Override
public void onCreate(Bundle savedInstanceState)
{
    setNextActivity(this);
    super.onCreate(savedInstanceState);
    // Do any activity-specific stuff
    doOncreate(savedInstanceState);
}

// Derived classes should NOT override onCreate(), but should
//  instead override doOnCreate() and put their activity-specific code there
protected void doOnCreate(Bundle savedInstanceState) {
}
    // This is the SplashLoader-specific onCreate() stuff
    LinearLayout lLayout = new LinearLayout(this);
    lLayout.setOrientation(LinearLayout.VERTICAL);
    ... etc etc etc ...
}

MainActivityで:

@Override
protected void doOnCreate(Bundle savedInstanceState)
{
    // This is the MainActivity-specific onCreate() stuff
    setContentView(R.layout.main);
    TextView tv = (TextView) findViewById(R.id.tv);
    tv.setText("hello");
}
于 2012-07-07T11:09:21.040 に答える