gpt4 book ai didi

java - 仅在应用程序启动时显示启动画面,而不是每次调用包含启动画面代码的 Activity 时显示启动画面

转载 作者:行者123 更新时间:2023-11-30 10:46:37 25 4
gpt4 key购买 nike

在开始按问题进行描述之前,我想指出我知道其他线程在问这个问题,但是对我来说没有一个能够解决我的问题。

之前提出的问题和我的问题之间的区别在于,我在主 Activity 中有初始屏幕代码,而在另一个 Activity 中没有,所以我没有用于此的布局 XML 文件。

所以,问题是,我只想在应用程序启动时显示启动画面,这是通过以下代码完美完成的,但是当 main activity(包含启动画面代码)时被另一个使用 Intent 的 Activity 调用,启动画面再次显示。

所以,首先我尝试使用 flag 变量,在创建 Activity 时初始化 0 并在显示一次启动画面时将其递增 1。但我发现它不会工作,因为在创建 Activity 时它总是 0

所以,现在我正尝试从其他 Activity 传递一个字符串,并尝试再次阻止启动画面,如以下代码所示:

public class Registration extends ActionBarActivity {

public final static String EXTRA_MESSAGE = "com.kaushal.myapplication.MESSAGE";

DatabaseHelper myDb;
EditText username,password;
private ImageView splashImageView;
boolean splashloading = false;
int flag=0;


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


String message = null;
Intent intent0 = getIntent();
message = intent0.getStringExtra(Registration.EXTRA_MESSAGE);//string from another activity.

if(!message.equals("signup has called me")) { //splash screen code in `if`
splashImageView = new ImageView(this);
//splashImageView.setBackgroundColor();
splashImageView.setImageResource(R.drawable.sexy);
setContentView(splashImageView);
splashloading = false;
Handler h = new Handler();

h.postDelayed(new Runnable() {
public void run() {
splashloading = false;
setContentView(R.layout.activity_registration);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
}
}, 3000);
flag++;
}

if(flag==0){
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
}

myDb = new DatabaseHelper(this);




}
}

这里 Registration 是我的主要 Activity 的名称,它在应用程序启动时启动。

另一个名为 sign Up 的 Activity 的方法代码,它传递一个字符串:

 public void backToRegistration(View view){
Intent intent0 = new Intent(this,Registration.class);
intent0.putExtra(EXTRA_MESSAGE, "signup has called me");
startActivity(intent0);
}

这个方法有什么问题?应用程序在启动后立即崩溃。

最佳答案

因此,在 Intent 中使用字符串作为这样的标志存在许多问题。字符串并不是真正为它设置的。开销比简单的原始 boolean 标志多一点。

按照您当前尝试的方式执行此操作

将您的 onCreate 代码更改为此

super.onCreate(savedInstanceState);

Intent intent0 = getIntent();
boolean showSplash = getIntent().getBooleanExtra(Registration.FLAG_KEY), true);

handleSplashScreen(showSplash);

并添加这个方法,我们将以某种递归的方式使用它来处理启动画面的显示。

private void handleSplashScreen(boolean showSplash){
if(showSplash) { //splash screen code in `if`
splashImageView = new ImageView(this);
//splashImageView.setBackgroundColor();
splashImageView.setImageResource(R.drawable.sexy);
setContentView(splashImageView);
splashloading = false;
Handler h = new Handler();

h.postDelayed(new Runnable() {
public void run() {
handleSplashScreen(false);
}
}, 3000);
}
else{
splashloading = false;
setContentView(R.layout.activity_registration);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
}
}

然后,当您从另一个 Activity 打开此 Activity 时

public void backToRegistration(View view){
Intent intent0 = new Intent(this,Registration.class);
intent0.putExtra(FLAG_KEY, false);
startActivity(intent0);
}

其中 FLAG_KEYprivate static FLAG_KEY = com.kaushal.myapplication.FLAG; 并替换 EXTRA_MESSAGE 字符串。

我建议如何做

现在,话说回来,这根本不是我推荐的做法。您应该只拥有一个在启动时调用并重定向到您的 Registration MainActivity 的 SplashScreenActivity。这摆脱了具有两个不同布局、标志等的 Activity 的卷积。

public class SplashScreenActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);

new Handler().postDelayed(new Runnable(){
@Override
public void run(){
startActivity(new Intent(SplashScreenActivity.this, MainActivity.class);
SplashScreenActivity.this.finish();
}
}, 3000);

}
}

R.layout.activity_splash 看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="R.drawable.sexy"
android:scaleType="centerInside" />

然后你可以像这样拥有 MainActivity

public class MainActivity extends ActionBarActivity{

// Variables here
...

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registration);

username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
}

// Other methods
...
}

最后,只需进入 list 并对其进行更新,以便在启动时显示新创建的 SplashScreenActivity,并确保 MainActivity 仍被正确声明。

<activity
android:name=".SplashScreenActivity"
android:label="@string/app_name">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity
android:name=".MainActivity"/>

没有更多的标志,没有更多的逻辑,没有更多的问题。它在启动时加载启动画面,仅此而已。 Activity 在通过 Intent 后完成,因此它不再位于堆栈中。一切都很好。其他问题处理这样的事情的原因是这是获得启动画面的推荐方法。

关于java - 仅在应用程序启动时显示启动画面,而不是每次调用包含启动画面代码的 Activity 时显示启动画面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36452478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com