我正在尝试让用户在旋转屏幕时更改其布局。 当我在虚拟机屏幕处于纵向位置时启动应用程序。 应用程序在启动时没问题但是当我将屏幕旋转到横向时,应用程序将停止并且logCat在第40行显示nullPointerException
第39行btn=(Button)findViewById(R.id.btn);
第40行btn.setOnClickListener(btnListener);
我认为findViewById()方法返回null,但我不知道为什么。 此外,如果我在横向位置的屏幕上启动应用程序,则会出现相同的错误。
已解决:问题可能是嵌套if的安排,为每个if和else添加大括号 - 如果确实解决了这个问题
以下是代码:
MainActivity.java
package com.example.test;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
SharedPreferences preference;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preference = getSharedPreferences("preferences", MODE_PRIVATE);
if(getResources().getConfiguration().orientation == 1)
if(preference.getInt("THE_CHECKED", 0) == 0)
setContentView(R.layout.portrait_black);
else if(preference.getInt("THE_CHECKED", 0) == 1)
setContentView(R.layout.portrait_white);
else if(getResources().getConfiguration().orientation == 2)
if(preference.getInt("THE_CHECKED", 0) == 0)
setContentView(R.layout.landscape_black);
else if(preference.getInt("THE_CHECKED", 0) == 1)
setContentView(R.layout.landscape_white);
btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(btnListener);
}
private Button.OnClickListener btnListener = new Button.OnClickListener()
{
public void onClick(View v)
{
Toast toast1 = Toast.makeText(MainActivity.this, "HI", Toast.LENGTH_LONG);
toast1.show();
}
};
private DialogInterface.OnClickListener theDialogListener = new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
SharedPreferences.Editor editor = preference.edit();
switch(which)
{
case 0: //Black
editor.putInt("THE_CHECKED", 0);
break;
case 1: //White
editor.putInt("THE_CHECKED", 1);
break;
}
editor.commit();
((Dialog)dialog).dismiss();
onCreate(new Bundle());
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
SharedPreferences.Editor editor = preference.edit();
switch (item.getItemId())
{
case R.id.theme:
Builder theDialog = new AlertDialog.Builder(this);
theDialog.setTitle("Theme");
theDialog.setSingleChoiceItems(R.array.theme_menu, preference.getInt("THE_CHECKED", 0), theDialogListener);
theDialog.show();
break;
}
editor.commit();
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
onCreate(new Bundle());
}
}
布局
portrait_white.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="portrait"
android:textSize="30sp"
android:textColor="#000000" />
</LinearLayout>
portrait_black.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="portrait"
android:textSize="30sp"
android:textColor="#000000" />
</LinearLayout>
landscape_white.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="landscape"
android:textSize="30sp"
android:textColor="#000000" />
</LinearLayout>
landscape_black.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="landscape"
android:textSize="30sp"
android:textColor="#000000" />
</LinearLayout>
LogCat(当我在屏幕处于横向位置时启动应用程序时)
02-21 01:26:53.895: D/AndroidRuntime(1836): Shutting down VM
02-21 01:26:53.925: W/dalvikvm(1836): threadid=1: thread exiting with uncaught exception (group=0x41465700)
02-21 01:26:53.935: E/AndroidRuntime(1836): FATAL EXCEPTION: main
02-21 01:26:53.935: E/AndroidRuntime(1836): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.os.Looper.loop(Looper.java:137)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread.main(ActivityThread.java:5103)
02-21 01:26:53.935: E/AndroidRuntime(1836): at java.lang.reflect.Method.invokeNative(Native Method)
02-21 01:26:53.935: E/AndroidRuntime(1836): at java.lang.reflect.Method.invoke(Method.java:525)
02-21 01:26:53.935: E/AndroidRuntime(1836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-21 01:26:53.935: E/AndroidRuntime(1836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-21 01:26:53.935: E/AndroidRuntime(1836): at dalvik.system.NativeStart.main(Native Method)
02-21 01:26:53.935: E/AndroidRuntime(1836): Caused by: java.lang.NullPointerException
02-21 01:26:53.935: E/AndroidRuntime(1836): at com.example.test.MainActivity.onCreate(MainActivity.java:40)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.Activity.performCreate(Activity.java:5133)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-21 01:26:53.935: E/AndroidRuntime(1836): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
02-21 01:26:53.935: E/AndroidRuntime(1836): ... 11 more
感谢。
答案 0 :(得分:6)
您的setContentView()
中没有Activity
,因此,实际上没有View
引用您的活动,也没有使用findViewById()
方法查找的视图,请确保setContentView()
实际上被称为......
问候!
答案 1 :(得分:1)
以这种方式使用它。您已编写嵌套if else,第二个条件永远不会在横向模式下执行,即 orientation == 2
package com.example.test;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
SharedPreferences preference;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preference = getSharedPreferences("preferences", MODE_PRIVATE);
if(getResources().getConfiguration().orientation == 1)
{
if(preference.getInt("THE_CHECKED", 0) == 0)
setContentView(R.layout.portrait_black);
else if(preference.getInt("THE_CHECKED", 0) == 1)
setContentView(R.layout.portrait_white);
}
else if(getResources().getConfiguration().orientation == 2)
if(preference.getInt("THE_CHECKED", 0) == 0)
setContentView(R.layout.landscape_black);
else if(preference.getInt("THE_CHECKED", 0) == 1)
setContentView(R.layout.landscape_white);
btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(btnListener);
}
private Button.OnClickListener btnListener = new Button.OnClickListener()
{
public void onClick(View v)
{
Toast toast1 = Toast.makeText(MainActivity.this, "HI", Toast.LENGTH_LONG);
toast1.show();
}
};
private DialogInterface.OnClickListener theDialogListener = new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
SharedPreferences.Editor editor = preference.edit();
switch(which)
{
case 0: //Black
editor.putInt("THE_CHECKED", 0);
break;
case 1: //White
editor.putInt("THE_CHECKED", 1);
break;
}
editor.commit();
((Dialog)dialog).dismiss();
onCreate(new Bundle());
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
SharedPreferences.Editor editor = preference.edit();
switch (item.getItemId())
{
case R.id.theme:
Builder theDialog = new AlertDialog.Builder(this);
theDialog.setTitle("Theme");
theDialog.setSingleChoiceItems(R.array.theme_menu, preference.getInt("THE_CHECKED", 0), theDialogListener);
theDialog.show();
break;
}
editor.commit();
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
onCreate(new Bundle());
}
}
答案 2 :(得分:0)
你可以打印getResources()。getConfiguration()。orientation,我认为它可能是其他值而不是1和2 事实上,我们有4个getResources()值.getConfiguration()。orientation:Configuration.ORIENTATION_PORTRAIT = 1,Configuration.ORIENTATION_LANDSCAPE = 2,Configuration.ORIENTATION_SQUARE = 3,Configuration.ORIENTATION_UNDEFINED = 0