没有查看的应用程序崩溃只在横向上声明

时间:2017-05-12 17:43:48

标签: android android-layout nullpointerexception

我创建了一个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");
}

4 个答案:

答案 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");
        }
    }
}

希望这会有所帮助〜