0

アプリにスプラッシュ スクリーンを実装したいと考えています。私はすでにこれをしました。しかし、現時点では 3 秒待ってから MainActivity クラスを呼び出します。それに関する問題は、ロードするデータがあり、現在のセットアップではユーザーが 2 回待機する必要があることです。すべてのデータをロードするスプラッシュ スクリーンが必要です。すべてが発生する MainActivity クラスがあり、SplashScreen クラスがあります。

バックグラウンドで実行したいメソッドは MainClass にあります。だから基本的に私はそのようなスプラッシュスクリーンクラスを持っています

public class SplashScreenActivity extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Void... params) {
    // TODO Auto-generated method stub

}

protected void onCancelled() {
    // TODO Auto-generated method stub
}

}

インポートとパッケージも実装しましたが、コピーはしていないので、問題にはなりません。さて、私の理解が正しければ、実行すべきタスクを doInBackground メソッドに記述する必要があります。つまり、基本的には、他のアクティビティ クラスからメソッドを呼び出す必要がありますよね?

public MainActivity mA = new MainActivity();

そして、私が書くメソッドでmA.parseXMLfromURL();

その後、メイン クラスのインテントを onPostExecute メソッドに次のように開始しますか?

protected void onPostExecute(Void... params) {
    Intent mainClass = new Intent(SplashScreenActivity.this, MainActivity.class);
    startActivity(mainClass);

}

さらに情報が必要な場合は、喜んでさらに詳しく説明します。

アップデート

さて、あなたのコメントの後、私はそれを少し違った方法で試しました.

これは私の oncreate メソッドです

    public void onCreate(Bundle savedInstanceState) {
    StrictMode.setThreadPolicy(policy);
    super.onCreate(savedInstanceState);
    sv      = new ScrollView(this);
    layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    sv.addView(layout);
    setContentView(sv);     

    new SplashScreenActivity().execute("URL TO FILE");
}

そして、これは SplashScreenActivity です

public class SplashScreenActivity extends AsyncTask<String, Void, Void> {
public MainActivity mA = new MainActivity();

protected void onPostExecute(Void... params) {
}

protected void onCancelled() {
    // TODO Auto-generated method stub
}

@Override
protected Void doInBackground(String... params) {
    mA.parseXMLfromURL(params);
    return null;
}

}

しかし、これは空白の画面を返すだけです。ただし、メイン アクティビティで parseXMLfromURL を呼び出すと、問題なく動作します。

@Raghunandan はコメントで、クラスのインスタンスを間違って作成したと述べました。回答を詳しく教えていただければ幸いです。

更新番号 2

現在の SplashScreen-Code は次のとおりです。

パッケージ de.activevalue.T1000flies;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;

public class SplashScreenActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_screen);

    new mTask().execute();
}

private class mTask extends AsyncTask<Void, Void, Void>{

    MainActivity mA = new MainActivity();
    @Override
    protected Void doInBackground(Void... arg0) {
        mA.parseXML();
        return null;
    }

    protected void onPostExecute(Void... params){
        Intent i = new Intent(SplashScreenActivity.this, MainActivity.class);
        startActivity(i);
        finish();
    }


}

}

そのコードを使用すると、アプリはスプラッシュスクリーンで動かなくなります。私の XML 解析に問題があるようです。XML 解析コードは次のとおりです。スプラッシュ画面なしでメインアクティビティを開始しただけで、問題なく動作することに注意してください

更新番号 3

行ごとにブレークポイントを作成してデバッグを開始しました。この線で飛び出す

rankingDate [k]             = new TextView(this);

コードの残りの部分

for(int k = 0; k < metaList.getLength(); k++){

            Node metaNode = metaList.item(k);
            System.out.println(metaList.getLength());
            rankingDate [k]             = new TextView(this);
            rdate       [k]             = new TextView(this);
            numberOE    [k]             = new TextView(this);

            Element metaElement = (Element) metaNode;
            NodeList rankingDateList    = metaElement.getElementsByTagName("date");
            Element rankingDateElement  = (Element) rankingDateList.item(0);
            rankingDateList             = rankingDateElement.getChildNodes();
            rankingDate [k].setText("RankingDate: " + ((Node) rankingDateList.item(0)).getNodeValue());
            layout.addView(rankingDate[k]);

            xmlSerializer.startTag(null, "date");
            xmlSerializer.text(((Node) rankingDateList.item(0)).getNodeValue());
            xmlSerializer.endTag(null, "date");

        }

system.out.println は 1 を返します。k は 0 です。では、なぜ Null Pointer Exception なのですか?

4

5 に答える 5

0

プロジェクトでまったく同じことを試みましたが、私のアプローチは異なっていました。もしかしたら、あなたの問題も解決するかもしれません...

最初に、私SplashScreenMainActivity

 //main-activtiy xml
 <RelativeLayout ...
     <RelativeLayout id="overlay" visible="true"... //filled parent and had a centered image
     <RelativeLayout id="mainActivity" visible="false"... //the application
  • アプリケーション起動
  • AsyncTaskまたはで開始ServiceしますonCreateMethod
  • Notificationデータがロードされている場合は、あなたに送信し、 MainActivity「ビューを入れ替える」のように

    public void functionCalledOnDataLoaded(){
       //do you init stuff
    
      ((RelativeLayout) findViewById(R.id.overlay)).setVisibility(View.INVISIBLE);
      ((RelativeLayout) findViewById(R.id.mainActivity)).setVisibility(View.VISIBLE);
    

    }

于 2013-10-07T14:34:55.350 に答える
0

MainActivity だけを作成してみませんか。Splash は main.xml の単なるフレーム レイアウトであり、一定時間後に setVisibility(View.GONE) になります。

この方法を使用すると、アクティビティは 1 つだけになります。したがって、中断することなくネットワークからのロードデータを処理する方が簡単です。

于 2013-10-07T15:18:43.337 に答える
0

スプラッシュ スクリーンを作成する簡単な方法は、Dialogsを使用してデータをロードする必要があるメイン アクティビティの前に表示することです。これを行う最も簡単な方法は、AsyncTask で onPreExecute() メソッドをオーバーライドすることです。以下は、スプラッシュ スクリーンの簡単な例です。

MainActivity.java

public class MainActivity extends Activity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new SplashScreen(this).execute();
    }
}

SplashScreen.java

public class SplashScreen extends AsyncTask<Void, Void, Void>
{
    Context ctxt;
    Dialog splash;

    public SplashScreen(Context ctxt)
    {
        this.ctxt = ctxt;
    }

    protected void onPreExecute()
    {
        splash = new Dialog(ctxt, R.style.full_screen);
        splash.show();
    }

    protected Void doInBackground(Void... ignore)
    {
        //Fetch stuff
        return null;
    }

    protected void onPostExecute(Void ignore)
    {
        splash.dismiss();
    }
}

res/values/styles.xml ファイルに、フルスクリーン用に次の xml を配置します。

<!-- Stuff that's already in here -->

<style name="full_screen" parent="android:Theme.Light">
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

<!-- Stuff that's already in here -->

これにより、非常に基本的なスプラッシュ スクリーン (つまり、何も表示されない空白のスクリーン) が表示されます。ダイアログ API を調べると、テキストの代わりに画像を使用したり、ダイアログのレイアウトを完全にカスタマイズしたりできる、他のカスタマイズ方法を見つけることができます。さらにカスタマイズが必要な場合は、DialogFragmentsも調べてください。このようにスプラッシュ スクリーンを作成する利点は、すべての情報を取得し、データの転送について心配することなく、onPostExecute() で MainActivity に設定できることです。

お役に立てれば!幸運を。

于 2013-10-07T14:22:21.470 に答える