java - 显示所有文本后切换到下一个 Activity ,而用户无需执行任何操作。显示所有文本后,屏幕自动更改

标签 java android android-intent

因此,当用户下载我的应用程序时,我希望初始 Activity 是出现应用程序标题的 FadedTextActivity 和另一个文本,然后我使用了 Timer code> 使其在 9 秒后自动移动到下一个 Activity。唯一的问题是,现在,例如 FadedTextActivity 是我的启动器 Activity ,如果用户登录,它会跳过该 Activity 、注册和登录 Activity 。

唯一的问题是,即使用户已经登录,由于某种原因,计时器仍然会关闭,即使它甚至不需要通过该 Activity 来启动应用程序(因为用户已经登录) …有没有办法让计时器仅在 FadedTextActivity 时才会关闭,并且如果它直接进入 MainActivity,则计时器不应像当前那样刷新页面?

FadingTextActivity

public class FadingTextActivity extends AppCompatActivity {

    FirebaseUser mFirebaseUser;

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

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    }

    @Override
    protected void onStart() {
        super.onStart();

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        if (mFirebaseUser != null && mFirebaseUser.isEmailVerified()) {
            startActivity(new Intent(FadingTextActivity.this, MainActivity.class));
            finish();
        } else {
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    startActivity(new Intent(getApplicationContext(), StartActivity.class));
                    finish();
                }
            }, 9000);

            FadingTextView fadingTextView = findViewById(R.id.fading_tv);
            String[] fadingTv = {"Events", "What's happening in your world today?"};
            fadingTextView.setTexts(fadingTv);
            fadingTextView.setTimeout(4, TimeUnit.SECONDS);
        }
    }
}

最佳答案

阅读 source code 后我想出了几种方法来知道所有文本何时显示在 FadingTextView 中

事实证明,他们可以轻松地为此提供一个监听器,但他们没有,所以我们需要做一些技巧,这些技巧不是很好的做法,并使代码变得复杂,但如果您真的想开始并在之后进行下一个 Activity 这里显示的文字是我的解决方案

解决方案1

如您所知,可以通过将您设置的时间与您在 setTexts() 中传递的字符串数量相乘来计算显示所有文本所需的时间,您只需检查后台线程即可如果自程序启动以来已经过了该时间,如下所示

 public class FadingTextActivity extends AppCompatActivity {
 private int startTime = System.currentTimeinMillis() 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fading_text);

    FadingTextView fadingTextView = findViewById(R.id.fading_tv);
    String[] fadingTv = {"Events", "What's happening in your world today?"};
    fadingTextView.setTexts(fadingTv);
    fadingTextView.setTimeout(3, TimeUnit.SECONDS);
 new TimeChecker().execute(3000);
}
}

创建异步任务

//create an inner class asynctask to check if the desired time is elapsed
 class TimeChecker extends AsynTask{
 protected Void doInBackground(Integer... params) {
                while(System.currentTimeMillis() < startTime + params[0]){}
               // it will continue to iterate whenever this thread get a chance and 
 //only exit if time you passed is over
 }
//below method will be called after above method means after the given time has 
 elapsed
protected void onPostExecute(Void result) {
     // start activity here
 }
}

虽然这不是一个非常好的和干净的解决方案,但我们没有太多选择

解决方案2

FadingTextView 中有一个 protected 方法,该方法在您给定的 timeout 时间后持续存在,因此,如果您在代码中创建 FadingTextView可以轻松地覆盖该方法并在第二次调用该方法时启动您的 Activity ,但这也不是一个很好的解决方案

解决方案3

你可以拿他们的source分析它并引入一个回调,当所有文本都渲染一次时,它会让您监听,您将不需要任何依赖项,然后您可以将整个源代码包含在您的项目中,它只是两个类和一些 res 文件

抱歉,我知道我没有提供非常优雅的解决方案,但我们没有任何其他选择,至少我无法弄清楚,因为我们无法修改“FadingEdgeText”的源代码,而且它看起来不像这个类是为继承而设计的,也没有为客户端提供太多功能,所以我们需要这些技巧

祝你有美好的一天

关于java - 显示所有文本后切换到下一个 Activity ,而用户无需执行任何操作。显示所有文本后,屏幕自动更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62389624/

相关文章:

java - Spring @ComponentScan 注释不起作用

java - 让我的类(class)进行争论

android - 如何从 https 服务器获得在 android 中有证书异常的响应?

java - 如何仅在满足特定条件时测试新 Activity 的 UI?

android - 其他 Activity 也被带到前面 StartActivity

java - JVM如何维护类数据和堆对象之间的关系?

android - 将 byte[] 数组转换为 String 在 android 中出现异常

java - Android 无法添加 getByName

Android玩市场推荐了解

java - Hibernate - 更新/选择后的结果相同