【问题标题】:ImageButton and NullPointerExceptionImageButton 和 NullPointerException
【发布时间】:2011-06-30 16:48:10
【问题描述】:

我是否会因为我引用的按钮嵌套在多个布局中而得到 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()中调用Button)

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;
}
}

最后是 logcat,我想...

06-30 13:01:29.390: 错误/AndroidRuntime(9189): 致命异常: main 06-30 13:01:29.390: 错误/AndroidRuntime(9189): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.simplyDesign.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(Native Method) 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.callActivityOnCreate(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 更多

edit_01

public void doAction(View v) {

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

}

我过去曾使用其他按钮指向 EditItemActivity,它们运行良好。

【问题讨论】:

  • 向我们展示您引用它并遇到问题的代码。另外,如果您在 Eclipse 中开发,请先尝试进入 Project -> Clean。
  • 在 logcat 上添加异常堆栈,并在活动中添加问题源代码部分
  • 您可以发布您尝试检索按钮的代码吗?没有它真的帮不上什么忙。
  • 好的,马上来。我试过清洁。什么都不做。

标签: android nullpointerexception imagebutton


【解决方案1】:

您发布的布局 XML 文件的名称是什么?它似乎不是browse.xml,因为其中包含您的ExpandableListView。您在 Java 代码中引用的 ID 必须出现在您设置的内容 View 中;否则,您必须自己为View 充气。

编辑

你会添加类似的东西

android:onClick="doAction"

到那个 ImageButton 的 XML。

然后,您的 Activity 中将有一个 doAction(View v) 方法来执行您的 onClick 操作。

【讨论】:

  • 您应该将行 XML 中该按钮的 android:onClick 设置为您的类中执行 onClick 操作的某个方法。你不能像那样引用View
  • 我编辑了我的答案以包含我的意思的一个例子。如果您希望每个ImageButton 都启动相同的Intent,那就可以了。否则,您需要创建一个自定义适配器。
  • stackoverflow.com/questions/5188196/… 的示例应该让您开始使用 ExpandableList 的适配器。
  • 这似乎运作良好。它摆脱了第一个异常。现在活动将加载!但是等等......不要改变频道还有更多!现在,如果我单击按钮,我会得到另一个 nullpointerexception!请参阅上面有问题的 edit_01。
  • 什么是空的?据我了解,如果您使用 XML onClick 属性,它会将被点击的视图作为参数传递,因此您需要让您的 doAction 接受View
【解决方案2】:

您提供的布局似乎适用于 R.layout.row。如果是这样,那么您找不到按钮就很有意义了。该按钮是为每一行动态创建的。您可能想要创建一个自定义适配器,然后在 getView 中设置点击处理程序。

【讨论】:

    【解决方案3】:

    试试这个代码,

     <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

    【讨论】:

    • ImageButtonTableRow 中。因此,是的,您可以跳过 layout_height 和 layout_width。
    • 我觉得无论如何,如果你在xml布局文件中使用View,你至少需要指定这两个参数。如果您在 java 代码中创建视图,情况并非如此。
    • "TableRow 的子项不需要在 XML 文件中指定 layout_width 和 layout_height 属性。TableRow 始终强制这些值分别为 MATCH_PARENT 和 WRAP_CONTENT。"来自 Android 开发者的网站。
    【解决方案4】:

    使用表格我在接收内部元素时遇到问题。尝试获取整个表格findViewById(R.id.the_table) 并使用myTableView.findViewById(R.id.a_row_in_the_table) 并获取行然后使用myTableRow.findViewById(R.id.my_element_in_this_row)

    【讨论】:

      【解决方案5】:
      Button editBrowseBtn = (Button) findViewById(R.id.browseEditBtn);
      

      您正在将 ImageButton 转换为 Button。 ImageButton 不是按钮:

      对象 -> 视图 -> TextView -> 按钮

      对象 -> 视图 -> ImageView -> 图片按钮

      所以试试这个:

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

      【讨论】:

      • 我最初有它有 ImageButton 但将其更改为 Button 认为这可能是问题所在。我会改回来的。
      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多