我创建了一个Hello World应用程序并添加了xml的Landscape版本。 在纵向模式下我没有TextView但在横向版本中我添加了TextView。我在java中为这个textView做了一个findviewbyid 在Manifest中,我将屏幕方向设置为横向。
我第一次启动应用:没问题。现在我按下电源关闭,然后按下电源按钮,应用程序崩溃,NullPointer异常,找不到textView。
如何在横向模式下确保应用加载正常,而无需在纵向模式下查找资源?
清单:
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
的活动:
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
tv.setText("inLandscape");
}
答案 0 :(得分:2)
如果您没有纵向模式的TextView,那么您需要将代码更改为:
tv = (TextView)findViewById(R.id.tv);
if(tv != null) {
tv.setText("inLandscape");
}
我不确定它是否有可能只能让它在景观中加载 - 当您重新启动设备时,它可能会尝试以纵向显示,然后切换到横向。如果这种行为是特定于设备并且没有记录,我不会感到惊讶。
答案 1 :(得分:0)
添加:
android:configChanges="orientation|keyboardHidden"
在你的活动中。
<activity android:name=".MainActivity"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
并覆盖您的活动中的onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
// ignore orientation/keyboard change
super.onConfigurationChanged(newConfig);
}
要获得更多说明,请参阅此Answer
答案 2 :(得分:0)
当您更改方向时,您的Activiy
将被销毁并重新创建。只有在手机位于TextView
:
ORIENTATION_LANDSCAPE
来解决此问题
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getResources().getConfiguration().orientation == android.content.res.Configuration.ORIENTATION_LANDSCAPE) {
// Initialize your TextView here
} else {
// Handle your potrait here
}
}
答案 3 :(得分:0)
您可以通过多种方式解决此错误。您可以在TextView
上设置text
之前向@GreyBeardedGeek
添加空检查。
OR,您可以使用orientation
添加有关设备getResources().getConfiguration().orientation
的检查。如果仅处于Landscape
模式,则将Text
设置为TextView
。我已经在我的设备上测试了它的罚款。
以下是工作代码:
import android.content.res.Configuration;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class LandscapePortraitActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
tv.setText("inLandscape");
}
}
}
希望这会有所帮助〜