android getViewById()NullPointerException

时间:2014-02-21 06:36:20

标签: java android nullpointerexception findviewbyid

我正在尝试让用户在旋转屏幕时更改其布局。 当我在虚拟机屏幕处于纵向位置时启动应用程序。 应用程序在启动时没问题但是当我将屏幕旋转到横向时,应用程序将停止并且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

感谢。

3 个答案:

答案 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