2017-09-30 11 views
0

2つのXMLファイルが作成されていて、どちらもレイアウトが完全に異なっています。私のアプリを携帯電話にデプロイすると、正常に読み込まれます。しかし、私がタブレットで同じことをすると、それは動作しないため、クラッシュします。 sw600dpレイアウトファイルでListViewが不足していることと関係がありますが、sw600dpデバイスがListViewのチェックを続行しないようにするにはどうすればよいですか?別の電話機とタブレットのXMLレイアウトは展開されていません

java.lang.NullPointerExceptionが:NULLオブジェクト参照に仮想メソッドを呼び出すための試み 'ボイドandroid.widget.ListView.setAdapter(android.widget.ListAdapter)'

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <ListView 
     android:id="@+id/listview_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

sw600dp/activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/abslistview_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:stretchColumns="*" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 
    <TableRow 
     android:id="@+id/MainActivity_tableRow0" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="20dp" > 


     <Button 
      android:id="@+id/MainActivity_btn0" 
      android:layout_column="0" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_circle" 
      android:onClick="btncircle_click" 
      android:text="@string/circle" 
      /> 

     <Button 
      android:id="@+id/MainActivity_btn1" 
      android:layout_column="1" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_star" 
      android:onClick="btnstar_click" 
      android:text="@string/star" 
      /> 
    </TableRow> 

    <TableRow 
     android:id="@+id/MainActivity_tableRow1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="20dp" > 

     <Button 
      android:id="@+id/MainActivity_btn2" 
      android:layout_column="0" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_square" 
      android:onClick="btnsquare_click" 
      android:text="@string/square" 
      /> 

     <Button 
      android:id="@+id/MainActivity_btn3" 
      android:layout_column="1" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_triangle" 
      android:onClick="btntriangle_click" 
      android:text="@string/triangle" 
      /> 
    </TableRow> 

    <TableRow 
     android:id="@+id/MainActivity_tableRow2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <Button 
      android:id="@+id/MainActivity_btn4" 
      android:layout_column="0" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_heart" 
      android:onClick="btnheart_click" 
      android:text="@string/heart" 
      /> 

     <Button 
      android:id="@+id/MainActivity_btn5" 
      android:layout_column="1" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:drawableStart="@drawable/ic_crescent" 
      android:onClick="btncrescent_click" 
      android:text="@string/crescent" 
      /> 
    </TableRow> 
</TableLayout> 

MainActivity.java

public class MainActivity extends Activity { 

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

     // array of images for ListView 
     int[] listviewImage = new int[]{ 
       R.drawable.ic_circle, 
       R.drawable.ic_star, 
       R.drawable.ic_square, 
       R.drawable.ic_triangle, 
       R.drawable.ic_heart, 
       R.drawable.ic_crescent 
     }; 

     // array of strings for ListView 
     String[] listviewTitle = new String[]{ 
       getResources().getString(R.string.circle), 
       getResources().getString(R.string.star), 
       getResources().getString(R.string.square), 
       getResources().getString(R.string.triangle), 
       getResources().getString(R.string.heart), 
       getResources().getString(R.string.crescent) 
     }; 

     List<HashMap<String, String>> aList = new ArrayList<>(); 

     for (int i = 0; i < 6; i++) { 
      HashMap<String, String> hm = new HashMap<>(); 
      hm.put("listview_image", Integer.toString(listviewImage[i])); 
      hm.put("listview_title", listviewTitle[i]); 
      aList.add(hm); 
     } 

     String[] from = {"listview_image", "listview_title"}; 
     int[] to = {R.id.mainitem_img, R.id.mainitem_title}; 

     SimpleAdapter simpleAdapter = new SimpleAdapter(this.getBaseContext(), aList, R.layout.listitem_main, from, to); 
     ListView list_main = this.findViewById(R.id.listview_main); 
     list_main.setAdapter(simpleAdapter); 

     list_main.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
       if (position == 0) { 
        //blah, blah, blah 
       } 

       if (position == 1) { 
        //blah, blah, blah 
       } 

       if (position == 2) { 
        //blah, blah, blah 
       } 

       if (position == 3) { 
        //blah, blah, blah 
       } 

       if (position == 4) { 
        //blah, blah, blah 
       } 

       if (position == 5) { 
        //blah, blah, blah 
       } 
      } 
     }); 
    } 

    public void btncircle_click(View view) { 
    } 

    public void btnstar_click(View view) { 
    } 

    public void btnsquare_click(View view) { 
    } 

    public void btntriangle_click(View view) { 
    } 

    public void btnheart_click(View view) { 
    } 

    public void btncrescent_click(View view) { 
    } 
} 

答えて

1

あなたの問題は、あなたがそのViewが存在しないので、あなたは、NULL値を取得しているタブレットにもかかわらず、あなたのlistview_mainをロードしようとしているということです。

この行は、あなたのタブレットにNULL値与えている:そのビューは、タブレットのレイアウトで定義されていないので

ListView list_main = this.findViewById(R.id.listview_main); 

を。

これを防ぐには、タブレットにあるのか携帯電話にあるのかを制御する必要があります。私はこれを解決して、resフォルダ内にリソースファイルを作成し、sw600dpフォルダにリソースファイルを作成しました。

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <bool name="is_tablet">false</bool> 
</resources> 

そしてsw600dp 1中:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <bool name="is_tablet">true</bool> 
</resources> 

は、次に、あなたのコード内であなたがタブレットにかであるかどうかを確認する必要がありますが、これを持っています主なもので

if (getResources().getBoolean(R.bool.is_tablet)) 

ここでは、読み込まれたレイアウトに従って何をすべきか知っています。

もう1つの方法は、2種類のアクティビティを用意し、isTabletの値を確認してMainActivityPhoneまたはMainActivityTabletをロードするランチャーアクティビティを作成することです。

希望すると助かります

関連する問題