ImageButton и исключение NullPointerException

Могу ли я получить NullPointerException, потому что кнопка, на которую я ссылаюсь, вложена в несколько макетов? Каждый раз, когда я ссылаюсь наBrowseEditBtn, я получаю исключение. Это простая кнопка! Ну давай же.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TableLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
android:orientation="horizontal" 
android:stretchColumns="*">
<!-- <include layout="@layout/mydesctextview" /> -->
<TableRow 
android:id="@+id/tableRow1" 
android:layout_width="wrap_content"
android:layout_height="wrap_content" 
android:orientation="horizontal">

        <TextView 
        android:text="TextView" 
        android:layout_width="wrap_content"
        android:layout_gravity="left|center_vertical" 
        android:id="@+id/txtItem" 
        android:textSize="20dip" 

        ></TextView>



        <ImageButton

        android:src="@drawable/editbtn"
        android:layout_marginRight="10dip" 
        android:layout_gravity="right|center_vertical"
        android:id="@+id/browseEditBtn"
        android:background="@drawable/my_group_statelist"
        ></ImageButton>

</TableRow>
</TableLayout>
</LinearLayout>

Исходный код (Кнопка вызывается в основном onCreate()):

public class BrowseActivity extends ExpandableListActivity {

final private String[] asColumnsToReturn = {
        Items.ITEMS_TABLE_NAME + "." + Items.ITEMS_ITEM,
        Items.ITEMS_TABLE_NAME + "." + Items.ITEMS_DESC,
        Items.ITEMS_TABLE_NAME + "." + Items.ITEMS_MANU,
        Items.ITEMS_TABLE_NAME + "." + Items.ITEMS_ID };

@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.browse);
    DbHelper dbh = new DbHelper(this.getApplicationContext());
    SQLiteDatabase db = dbh.getWritableDatabase();
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(Items.ITEMS_TABLE_NAME);

    ExpandableListView browseView = (ExpandableListView)    findViewById(android.R.id.list);
    Button editBrowseBtn = (Button) findViewById(R.id.browseEditBtn);

    Cursor mCursor = queryBuilder.query(db, asColumnsToReturn, null, null,
            null, null, Items.DEFAULT_SORT_ORDER);
    startManagingCursor(mCursor);

    SimpleExpandableListAdapter mAdapter = new SimpleExpandableListAdapter(
            this, createGroup(), R.layout.row, R.layout.row, new String[] {
                    Items.ITEMS_ITEM, Items.ITEMS_DESC }, new int[] {
                    R.id.txtItem, R.id.dscItem }, createChildren(),
            R.layout.exprow, new String[] { Items.ITEMS_DESC,
                    Items.ITEMS_MANU }, new int[] { R.id.dscItem,
                    R.id.manuItem });
    browseView.setAdapter(mAdapter);

    editBrowseBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(BrowseActivity.this,
                    EditItemActivity.class);
            startActivity(intent);

        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add("Add Item").setIntent(new Intent(this, AddItemActivity.class));

    return super.onCreateOptionsMenu(menu);
}

@SuppressWarnings("rawtypes")
public List createGroup() {
    DbHelper dbh = new DbHelper(this.getApplicationContext());
    SQLiteDatabase db = dbh.getWritableDatabase();
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(Items.ITEMS_TABLE_NAME);

    Cursor mCursor = queryBuilder.query(db, new String[] {
            Items.ITEMS_ITEM, Items.ITEMS_DESC }, null, null, null, null,
            Items.DEFAULT_SORT_ORDER);
    startManagingCursor(mCursor);

    ArrayList<HashMap<String, String>> groupList = new ArrayList<HashMap<String,   String>>();
    mCursor.moveToFirst();
    while (!(mCursor.isAfterLast())) {

        HashMap<String, String> groupMap = new HashMap<String, String>();
        groupMap.put(Items.ITEMS_ITEM,
                mCursor.getString(mCursor.getColumnIndex(Items.ITEMS_ITEM)));
        groupMap.put(Items.ITEMS_DESC,
                      mCursor.getString(mCursor.getColumnIndex(Items.ITEMS_DESC)));

        groupList.add(groupMap);
        mCursor.moveToNext();
    }

    return (List) groupList;
}

@SuppressWarnings("rawtypes")
public List createChildren() {
    DbHelper dbh = new DbHelper(this.getApplicationContext());
    SQLiteDatabase db = dbh.getWritableDatabase();
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(Items.ITEMS_TABLE_NAME);

    Cursor mCursor = queryBuilder.query(db, new String[] {
            Items.ITEMS_ITEM, Items.ITEMS_DESC, Items.ITEMS_MANU }, null,
            null, null, null, Items.DEFAULT_SORT_ORDER);
    startManagingCursor(mCursor);
    mCursor.moveToFirst();

    ArrayList<ArrayList<HashMap<String, String>>> childList = new ArrayList<ArrayList<HashMap<String, String>>>();

    while (!(mCursor.isAfterLast())) {

        ArrayList<HashMap<String, String>> childListDesc = new                      ArrayList<HashMap<String, String>>();

        for (int i = 0; i < 1; i++) {
            HashMap<String, String> childMap = new HashMap<String, String>();
            childMap.put(Items.ITEMS_DESC, mCursor.getString(mCursor
                    .getColumnIndex(Items.ITEMS_DESC)));
            childMap.put(Items.ITEMS_MANU, mCursor.getString(mCursor
                    .getColumnIndex(Items.ITEMS_MANU)));

            childListDesc.add(childMap);

        }

        childList.add(childListDesc);
        mCursor.moveToNext();
    }

    return (List) childList;
}
}

И, наконец, логарифм, я думаю...

06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): java.lang.RuntimeException: Невозможно запустить активность ComponentInfo{com. simpleDesign.mdk/com.simplyDesign.mdk.BrowseActivity}: java.lang.NullPointerException 06-30 13:01:29.390: ОШИБКА/AndroidRuntime (9189): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 06 -30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app .ActivityThread.access$2300(ActivityThread.java:125) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 06-30 13: 01:29.390: ОШИБКА/AndroidRuntime(9189): на android.os.Handler.dispatchMessage(Handler.java:99) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): на android.os.Looper.loop (Looper.java:123) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app.ActivityThread.main(ActivityThread.java:4627) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в java.lang.reflect .Method.invokeNative(собственный метод) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в java.lang.reflect.Method.invoke(Method.java:521) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в com.android.internal .os.ZygoteInit.main(ZygoteInit.java:616) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в dalvik.system.NativeStart.main(собственный метод) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): Причина: java.lang.NullPointerException 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в com.simplyDesign.mdk.BrowseActivity.onCreate(BrowseActivity.java:62) 06- 30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app.Instrumentation.callActivityOnC reate(Instrumentation.java:1049) 06-30 13:01:29.390: ОШИБКА/AndroidRuntime(9189): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 06-30 13:01:29.390: ОШИБКА/ AndroidRuntime(9189): ... еще 11

изменить_01

public void doAction(View v) {

    startActivity(new Intent(getApplicationContext(),
            EditItemActivity.class));

}

Раньше я использовал другие кнопки, чтобы указать на EditItemActivity, и они работали нормально.


person atomSmasher    schedule 30.06.2011    source источник
comment
Покажите нам код, на который вы ссылаетесь, и у вас возникла проблема. Кроме того, попробуйте сначала перейти в Project -> Clean, если вы разрабатываете в Eclipse.   -  person Glendon Trullinger    schedule 30.06.2011
comment
добавьте стек исключения, которое у вас есть в логарифме, и добавьте часть кода в свою деятельность, которая является источником проблемы   -  person Houcine    schedule 30.06.2011
comment
Можете ли вы опубликовать код, с помощью которого вы пытаетесь получить кнопку? Без него особо не поможешь.   -  person AC2MO    schedule 30.06.2011
comment
Конечно, скоро. Я пробовал чистить. Ничего не делает.   -  person atomSmasher    schedule 30.06.2011


Ответы (5)


Как называется XML-файл макета, который вы разместили? Это не похоже на browser.xml, потому что в нем есть ваш ExpandableListView. Идентификаторы, на которые вы ссылаетесь в своем коде Java, должны появляться в содержимом View, которое вы установили; в противном случае вы должны надуть View самостоятельно.

Изменить

Вы бы добавили что-то вроде

android:onClick="doAction"

в XML этого ImageButton.

Тогда у вас будет метод doAction(View v) в вашей деятельности, который будет выполнять ваши действия onClick.

person Glendon Trullinger    schedule 30.06.2011
comment
Вы должны установить android:onClick этой кнопки в строке XML для некоторого метода в вашем классе, который выполняет ваше действие onClick. Вы не можете так ссылаться на View. - person Glendon Trullinger; 30.06.2011
comment
Я отредактировал свой ответ, чтобы включить пример того, что я имею в виду. Если вы хотите, чтобы каждый ImageButton запускал один и тот же Intent, это сработает. В противном случае вам потребуется создать собственный адаптер. - person Glendon Trullinger; 30.06.2011
comment
Пример здесь stackoverflow.com/questions/5188196/ должен помочь вам начать работу с адаптером для ExpandableList. - person Glendon Trullinger; 30.06.2011
comment
Кажется, это работает хорошо. Он избавляется от первого исключения. Теперь активность загрузится! Но подождите.... не переключайте канал, это еще не все! Теперь, если я нажму на кнопку, я получу еще одно исключение nullpointerexception! См. edit_01 в вопросе выше. - person atomSmasher; 30.06.2011
comment
Что он говорит, является нулевым? Насколько я понимаю, если вы использовали XML-атрибут onClick, он передает представление, которое было нажато, в качестве параметра, поэтому вам нужно, чтобы ваше действие doAction принимало View. - person Glendon Trullinger; 30.06.2011
comment
Извините, это опечатка, (View v) находится внутри скобок. Выбрасывает НПЭ. - person atomSmasher; 30.06.2011
comment
Не могли бы вы опубликовать трассировку стека, связанную с NPE, и указать, какая строка ее выдает? - person Glendon Trullinger; 30.06.2011
comment
Неважно .. Я посмотрел на трассировку стека (все еще привыкаю к ​​ней) и нашел проблему. IThe NPE был на следующем мероприятии. Последняя версия приложения, которую я торкнул, пропихнула связку, явно не нашла! Спасибо за вашу помощь. - person atomSmasher; 30.06.2011

Похоже, что макет, который вы предоставили, предназначен для R.layout.row. Если это так, то это имеет большой смысл, что вы не можете найти кнопку. Кнопка создается динамически для каждой строки. Вероятно, вы захотите создать собственный адаптер, а затем в getView установить обработчик кликов.

person kabuko    schedule 30.06.2011

Попробуйте этот код,

 <ImageButton
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" 
    android:src="@drawable/editbtn"
    android:layout_marginRight="10dip" 
    android:layout_gravity="right|center_vertical"
    android:id="@+id/browseEditBtn"
    android:background="@drawable/my_group_statelist"
    ></ImageButton>

Вы не можете пропустить layout_height и layout_width

person dcanh121    schedule 30.06.2011
comment
ImageButton находится в TableRow. Поэтому да, можно пропустить layout_height и layout_width. - person Glendon Trullinger; 30.06.2011
comment
Я думаю, несмотря ни на что, если вы используете View в xml файле макета, вам нужно как минимум указать эти два параметра. Это не так, если вы создаете представление в java-коде. - person dcanh121; 30.06.2011
comment
Дочерним элементам TableRow не нужно указывать атрибуты layout_width и layout_height в файле XML. TableRow всегда применяет эти значения соответственно MATCH_PARENT и WRAP_CONTENT. с веб-сайта разработчика Android. - person Glendon Trullinger; 30.06.2011

используя таблицы, у меня были проблемы с получением внутренних элементов. Попробуйте получить таблицу целиком findViewById(R.id.the_table) и использовать myTableView.findViewById(R.id.a_row_in_the_table) и получить строку, а затем использовать myTableRow.findViewById(R.id.my_element_in_this_row)

person Mutmatt    schedule 30.06.2011

Button editBrowseBtn = (Button) findViewById(R.id.browseEditBtn);

Вы переводите ImageButton в кнопку. ImageButton не является кнопкой:

Объект -> Вид -> TextView -> Кнопка

Объект -> Вид -> ImageView -> ImageButton

Итак, попробуйте следующее:

ImageButton editBrowseBtn = (ImageButton) findViewById(R.id.browseEditBtn);
person nhaarman    schedule 30.06.2011
comment
Первоначально у меня был ImageButton, но я изменил его на Button, думая, что, возможно, это проблема. поменяю обратно. - person atomSmasher; 30.06.2011