2011-06-30 20 views
0

参照しているボタンが複数のレイアウト内にネストされているため、NullPointerExceptionが発生することがありますか?私はbrowseEditBtnを参照するたびに例外が発生します。それはシンプルなボタンです!いい加減にして。ImageButtonとNullPointerException

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

そして最後にlogcatは、私が思う...

6月30日13:01:29.390:ERROR/AndroidRuntime(9189):致命的な例外:メイン 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):java.lang.RuntimeException:アクティビティを開始できませんでしたComponentInfo {com.simplyDesign。 m dk/com.simplyDesign.mdk.BrowseActivity}:java.lang.NullPointerException 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 06 -30 13:01:29.390:ERROR/AndroidRuntime(9189):android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android。 app.ActivityThread.access $ 2300(ActivityThread.java:125) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033) 06- 30 13:01:29.390:ERROR/AndroidRuntime(9189):android.os.Handler.dispatchMessage(Handler.java:99) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android.os .Looper.loop(Looper.java:123) 06-30 13:01:29.390 :ERROR/AndroidRuntime(9189):android.app.ActivityThread.main(ActivityThread.java:4627) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):java.lang.reflect.Method.invokeNativeで(ネイティブメソッド) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):java.lang.reflect.Method.invoke(Method.java:521) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:616) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):dalvik.system.NativeStart.main(ネイティブメソッド) 06-30 13:01:29.390 :ERROR/AndroidRuntime(9189):原因:java.lang.NullPointerException 06-30 13:01:29.390:ERROR/AndroidRuntime(9189 ):com.simplyDesign.mdk.BrowseActivity.onCreate(BrowseActivity.java:62) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) ) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 06-30 13:01:29.390:ERROR/AndroidRuntime(9189):私はEを指すように、過去に他のボタンを使用していた... 11もっと

edit_01

public void doAction(View v) { 

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

} 

ditItemActivityとうまく働いています。

+0

参考にして問題のあるコードを表示してください。また、Eclipseで開発している場合は、[プロジェクト] - > [最初にクリーンアップ]に行ってみてください。 –

+0

logcatにある例外のスタックを追加し、問題の原因となるアクティビティにコードの一部を追加してください – Houcine

+0

ボタンを取得しようとしているコードを投稿できますか?それがなければ本当に助けてくれません。 –

答えて

1

投稿したレイアウトXMLファイルの名前は何ですか?その中にExpandableListViewがあるため、browse.xmlは表示されません。 Javaコードで参照するIDは、設定したコンテンツViewに表示されている必要があります。そうでない場合は、自分自身でViewを膨らませる必要があります。

編集

あなたはそれのImageButtonのXMLに

android:onClick="doAction" 

のようなものを追加します。

あなたのアクティビティには、あなたのonClickアクションを行うdoAction(View v)メソッドがあります。

+0

あなたのonClickアクションを行うクラス内のメソッドに、行XMLのボタンの 'android:onClick'を設定する必要があります。そのような 'View'を参照することはできません。 –

+0

私は自分の答えを編集して、私が意味するものの例を含めました。すべての 'ImageButton'が同じ' Intent'を開始するようにしたい場合、それは正常に動作します。それ以外の場合は、カスタムアダプターを作成する必要があります。 –

+0

ここの例はhttp://stackoverflow.com/questions/5188196/how-to-write-custom-expandablelistadapterで、ExpandableList用のアダプタを使い始める必要があります。 –

0

はあなたがlayout_heightスキップして、私は内側の要素を受ける問題があったテーブルを使用して

+1

'ImageButton'は' TableRow'にあります。したがって、はい、あなたはlayout_heightとlayout_widthをスキップすることができます。 –

+0

View in XMLレイアウトファイルを使用する場合は、これらの2つのパラメータを少なくとも指定する必要があります。 Javaコードでビューを作成する場合はそうではありません。 – dcanh121

+0

"TableRowの子は、XMLファイルのlayout_width属性とlayout_height属性を指定する必要はありません。これらの値は、常にMATCH_PARENTとWRAP_CONTENTになります。 Androidデベロッパーのウェブサイトから。 –

0

をlayout_widthすることはできません

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

、このコードを試してみてください。テーブル全体をfindViewById(R.id.the_table)として使用し、myTableView.findViewById(R.id.a_row_in_the_table)を使用して行を取得してください。myTableRow.findViewById(R.id.my_element_in_this_row)

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

ImageButtonをButtonにキャストしようとしています。 ImageButtonがボタンではありません。

オブジェクト - >表示 - > TextViewに - >ボタン

オブジェクト - >表示 - > ImageViewの - > のImageButton

だから、これを試してみてください。

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

私はもともとImageButtonを持っていましたが、おそらくそれが問題だったと思ってButtonに変更しました。私はそれを元に戻す。 – atomSmasher

1

あなたが提供したレイアウトがR.layout.row用であるようです。もしそうなら、それはあなたがボタンを見つけることができないということを多く意味する。ボタンは、各行に対して動的に作成されます。カスタムアダプタを作成し、getViewでクリックハンドラを設定したいと思うかもしれません。