启动器活动显示为空白屏幕

时间:2017-10-30 11:05:02

标签: android splash

我正在为我的应用程序制作启动画面,我只是测试将主要线程置于睡眠而不是使用计时器。我的代码是:

package com.example.somu.activityswitcher;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class LauncherActivity extends AppCompatActivity {

    public void firstActivity() {
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        startActivity(intent);
    }

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

        TextView countDown = findViewById(R.id.count);
        for (int cd=3;cd>0;cd--) {
            try {
                Thread.sleep(1000);
                countDown.setText(Integer.toString(cd));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        firstActivity();
    }
}

当MainActivity在3秒后加载时,启动画面(LauncherActivity)只是一个空白屏幕!这是怎么回事?!

activity_launcher.xml

<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.somu.activityswitcher.LauncherActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:scaleType="fitCenter"
        android:scaleX="0.25"
        android:scaleY="0.25"
        app:srcCompat="@drawable/logo" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/count"
        android:layout_centerHorizontal="true"
        android:text="Switching in..." />

    <TextView
        android:id="@+id/count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="70dp"
        android:text="3"
        android:textColor="@android:color/black"
        android:textSize="50sp" />
</android.widget.RelativeLayout>

我该如何解决这个问题?!

注意:我对以任何方式解决此问题并不感到困扰..我想知道为什么这个方法不起作用,下一步是什么没有明确使用计时器的最佳方法。

6 个答案:

答案 0 :(得分:1)

试试这个,  这可能对你有用。

public class LauncherActivity extends AppCompatActivity {
private TextView countDown;
int cd;

public void firstActivity() {
    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(intent);
}

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

    countDown = (TextView) findViewById(R.id.count);

    try {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                for (cd = 3; cd > 0; cd--) {
                  countDown.setText(Integer.toString(cd));
                }
                firstActivity();

            }
        }, 3000);

    } catch (Exception e) {
        e.printStackTrace();
    }
}



}

如果你想添加倒计时而不是把它放在处理程序中,

   new CountDownTimer(3000, 1000) {

        public void onTick(long millisUntilFinished) {
            countDown.setText("seconds remaining: " + millisUntilFinished / 1000);

        }

        public void onFinish() {
            countDown.setText("done!");
            firstActivity();
        }

    }.start();

答案 1 :(得分:0)

您正在主线程中使用Thread.sleep(1000);来冻结您的用户界面。

由于UI线程被冻结,与此同时,活动将无法充气和渲染,导致仅出现空白屏幕。

但是,您可以在后台线程中使用Thread.sleep,但无法直接从后台线程更新UI。如果您将倒计时代码放在runOnUiThread

中,可以使用Thread从后台线程更新UI
new Thread(new Runnable(){
    public void run(){
        //countdown code.
        runOnUiThread(new Runnable(){
            public void run(){
                textView.setText(...
            }
        });
    }
}).start()

答案 2 :(得分:0)

Thread.sleep(1000);冻结您的UI

试试这个

Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        timer = new Timer();
        timer.scheduleAtFixedRate(new RemindTask(), 3000, 1000); // delay*/
    }

private class RemindTask extends TimerTask {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                public void run() {
                    i++;
                    Log.e("title", "" + i);
                    tv.setText(i + "");
                    if (i == 3) {
                        timer.cancel();
                        firstActivity();
                    }

                }
            });

        }
    } 

答案 3 :(得分:0)

尝试使用此代替Thread.sleep(1000);

new CountDownTimer(3000, 1000) {
            @Override
            public void onTick(long l) {
                    countDown.setText(Integer.toString(l/1000));
            }

            @Override
            public void onFinish() {
                firstActivity();
                finish();
            }
        }.start();

答案 4 :(得分:0)

尝试使用CountDownTimer来显示计时器而不是Thread或Handler,如下所示:

onTick()在UI线程上运行,因此您可以在尝试在countDown TextView上显示(3,2,1)时更新此方法中的UI。

当给定计时器完成时,

onFinish被调用,因此当您尝试显示另一个活动时,您可以在计时器完成后在此处编写代码。

new CountDownTimer(3000, 1000) {

     public void onTick(long millisUntilFinished) {
         countDown.setText(""+ (millisUntilFinished / 1000));
     }

     public void onFinish() {
         firstActivity();
     }
  }.start();

答案 5 :(得分:0)

try this code.

 Intent intent = new Intent(this, WelcomeActivity.class);
 new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            try{
            startActivity(intent);
            finish();
            }
            catch (Exception e){

            }
           }
    }, 1000);