将方向从横向更改为纵向时应用程序崩溃



错误**2020-03-01 17:36:58.959 6589-6589/com.studentthelper.bscit E/AndroidRuntime:致命异常:main流程:com.studentthelper.bscit,PID:6589java.lang.RuntimeException:无法启动活动ComponentInfo{com.studentthelper.bscit/com.studenthelper.bschit.MainActivity}:java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法"void android.widget.TextView.setText(java.lang.CharSequence("在android.app.ActivityThread.performLaunchActivity(ActivityThreads.java:2914(在android.app.ActivityThread.handleLaunchActivity(ActivityThreads.java:3049(在android.app.ActivityThread.handleRelaunchActivityInner(ActivityThreads.java:4785(在android.app.ActivityThread.handleRelaunchActivity(ActivityThreads.java:4694(在android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItems.java:69(在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108(在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68(在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1809(在android.os.Handler.dispatchMessage(Handler.java:106(在android.os.Looper.loop(Looper.java:193(在android.app.ActivityThread.main(ActivityThreads.java:6692(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:858(引起原因:java.lang.NullPointerException:试图在null对象引用上调用虚拟方法"void android.widget.TextView.setText(java.lang.CharSequence("网址:com.studentthelper.bscit.MainActivity.onCreate(MainActivity.java:21(在android.app.Activity.performCreate(Activity.java:7140(在android.app.Activity.performCreate(Activity.java:7131(在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272(在android.app.ActivityThread.performLaunchActivity(ActivityThreads.java:2894(在android.app.ActivityThread.handleLaunchActivity(ActivityThreads.java:3049(在android.app.ActivityThread.handleRelaunchActivityInner(ActivityThreads.java:4785(在android.app.ActivityThread.handleRelaunchActivity(ActivityThreads.java:4694(在android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItems.java:69(在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108(在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68(在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1809(在android.os.Handler.dispatchMessage(Handler.java:106(在android.os.Looper.loop(Looper.java:193(在android.app.ActivityThread.main(ActivityThreads.java:6692(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:858(**

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
TextView textView=findViewById(R.id.logotext);
int unicode=0x1F4A1;
String emoji=getEmoji(unicode);
String Text="Bsc"+emoji+"T";
textView.setText(Text);
}
public String getEmoji(int uni)
{
return new String(Character.toChars(uni));
}

根据您的崩溃日志:

com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: 
java.lang.NullPointerException: Attempt to invoke virtual method 'void 
android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at 
com.studenthelper.bscit.MainActivity.onCreate(MainActivity.java:20) 

这意味着您的text查看

TextView textView=findViewById(R.id.logotext);

在布局R.layout.activity_main中找不到,因此当您尝试textView.setText(Text);时,它实际上是null,并发生异常。

所以,我建议

  1. 验证textVIew布局中的Id是否相同?以及
  2. 设置getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main);之前
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.logotext);
int unicode=0x1F4A1;
String emoji=getEmoji(unicode);
String Text="Bsc"+emoji+"T";
textView.setText(Text);
}

总结问题:您定义了两个布局,其中一个没有TextView。从您的代码中可以明显看出,崩溃是由对null对象调用.setText()引起的。

最好的方法总是将丢失的TextView添加回另一个布局,这样所有布局都包含相同的ID集。这样可以避免findViewById()引起的错误。在不需要TextView的布局中,只需设置其android:visibility="gone"即可将其隐藏。

或者回到您的代码,如果您知道TextView并不总是存在,那么在调用.setText()之前,您可以简单地检查textView变量是否为null。这也可以避免CCD_ 14。

最新更新