1
votes

I want to make it so that a user clicks a button to launch a dialog. It crashes when I click the button. Here's the logcat:

nullpointerexception at com.shoppinglist.ShoppingList$1$2.onClick(ShoppingList.java:50) at android.view.View.performClick(View.java:2344) at android.view.View.onTouchEvent(View.java:4133) at android.widget.TextView.onTouchEvent(TextView.java:6510) at android.view.View.dispatchTouchEvent(View.java:3672) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)

Here's my .java file:

package com.shoppinglist;

import java.util.ArrayList;

import android.app.Dialog;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class ShoppingList extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final EditText et = (EditText) findViewById(R.id.edittext);
        ListView lv = (ListView) findViewById(android.R.id.list);
        final ArrayList<String> items = new ArrayList<String>();
        final ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(
        this, android.R.layout.simple_list_item_1, items);
        lv.setAdapter(adapter);

        Button button1main = (Button) findViewById(R.id.add);
        button1main.setOnClickListener(new OnClickListener()  {
            @Override
            public void onClick(View v)  {
            final Dialog additem = new Dialog(ShoppingList.this);
            additem.setContentView(R.layout.maindialog);
            additem.setTitle("Type your item");
            additem.setCancelable(true);
            et.setHint("Type the name of an item...");

        Button button = (Button) findViewById(R.id.cancel);
        button.setOnClickListener(new OnClickListener()  {
                @Override
                public void onClick(View v)  {
                    additem.dismiss();
                }
            });
            additem.show();

        Button ok = (Button) findViewById(R.id.ok);
        ok.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                items.add(et.getText().toString());
                adapter.notifyDataSetChanged();
                additem.dismiss();
                et.setText("");
        }

            }
        );
       }
        });
    }
}

Here's my main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FF9900"
    android:padding="10dp"
    android:orientation="vertical">
        <Button
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add item..."
            android:layout_gravity="center"/>
        <ListView android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#FFCC00"/>  
</LinearLayout>

Here's my dialog xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:id="@+id/layout_root"
  android:orientation="vertical"
  android:background="#FFFFFF"
  android:minHeight="100dp"
  android:minWidth="300dp">
  <EditText
     android:id="@+id/edittext"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"/>
 <LinearLayout
    android:id="@+id/button_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:layout_gravity="bottom">
  <Button
    android:id="@+id/ok"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Ok"/>
  <Button
    android:id="@+id/cancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Cancel"/>
  </LinearLayout>   
</LinearLayout>
2
In your code, you have additem.setContentView(R.layout.maindialog); and the name of your dialog is dialog.xml. Is that a typo?ccheneson
No, it's main_dialog.xmlCg2916

2 Answers

4
votes
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final EditText et = (EditText) findViewById(R.id.edittext);
    ListView lv = (ListView) findViewById(android.R.id.list);
    final ArrayList<String> items = new ArrayList<String>();
    final ArrayAdapter<String> adapter;
    adapter = new ArrayAdapter<String>(
    this, android.R.layout.simple_list_item_1, items);
    lv.setAdapter(adapter);

    Button button1main = (Button) findViewById(R.id.add);

In your code, you use setContentView to R.layout.main. Then you try to find R.id.edittext in the R.layout.main but edittext exists in maindialog.xml. So when you call

final EditText et = (EditText) findViewById(R.id.edittext);

et will be null and any method call on et will result of a NullPointerException

Edit

Try this:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ListView lv = (ListView) findViewById(android.R.id.list);
        final ArrayList<String> items = new ArrayList<String>();
        final ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(
        this, android.R.layout.simple_list_item_1, items);
        lv.setAdapter(adapter);

        Button button1main = (Button) findViewById(R.id.add);
        button1main.setOnClickListener(new OnClickListener()  {
            @Override
            public void onClick(View v)  {
            final Dialog additem = new Dialog(ShoppingList.this);
            additem.setContentView(R.layout.maindialog);
            final EditText et = (EditText)additem.findViewById(R.id.edittext);
            additem.setTitle("Type your item");
            additem.setCancelable(true);
            et.setHint("Type the name of an item...");

            Button button = (Button) additem.findViewById(R.id.cancel);
            button.setOnClickListener(new OnClickListener()  {
                @Override
                public void onClick(View v)  {
                    additem.dismiss();
                }
            });
            additem.show();

            Button ok = (Button) additem.findViewById(R.id.ok);
            ok.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    items.add(et.getText().toString());
                    adapter.notifyDataSetChanged();
                    additem.dismiss();
                    et.setText("");
                }
            });
       }
        });
1
votes

If I've got my line numbers correct, the null pointer exception is occurring in this block:

new OnClickListener() {
            @Override
            public void onClick(View v) {
                items.add(et.getText().toString());
                adapter.notifyDataSetChanged();
                additem.dismiss();
                et.setText("");
        }

The error is saying that one of the variables you are accessing is null. In this function you are accessing et, et.getText(), items, adapter, and additem. I'd suggest debugging this section (through eclipse, or printing log statements) to determine which item is null.