2016-01-21 2 views
0

Я следовал this tutorial и создал макет, содержащий 3 фрагмента, и использовал ViewPager для их переключения, он работал отлично. Затем я попытался добавить GridView в средний фрагмент, чтобы его можно было выполнить как галерею изображений, как показано в this tutorial, но я продолжал получать сообщения «К сожалению, ** остановился». в начале я думал, что это может быть, потому что размер изображений слишком велик для запуска, поэтому я использовал образцы изображений из второго учебника, но это не сработало.GridView в разбитом фрагменте

Пожалуйста, помогите мне, так как он беспокоит меня несколько дней. Заранее спасибо. : D

Это мой LogCat:

java.lang.RuntimeException: Unable to start activity ComponentInfo{my.com.impressor.demo2/my.com.impressor.demo2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference 
at my.com.impressor.demo2.MainActivity.onCreate(MainActivity.java:27) 
at android.app.Activity.performCreate(Activity.java:6237) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Это мой средний fragment.java содержащий GridView:

public class Fragment2 extends Fragment { 

private GridView gridView; //added regarding to the answer by Atual in <http://stackoverflow.com/questions/22613064/using-gridview-image-in-fragment> 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment2, container, false); 
    GridView gridView = (GridView) view.findViewById(R.id.gridview); 
    gridView.setAdapter(new ImageAdapter(getActivity().getApplicationContext())); 
    return view; 
} 

} 

Это соответствующий XML-файл:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:color/white" 
android:orientation="vertical" > 

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:columnWidth="90dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
    /> 

Th это является MainActivity:

public class MainActivity extends AppCompatActivity { 

//ImageView im; 

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

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(this)); 

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      Toast.makeText(MainActivity.this, "" + position, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    tabLayout.addTab(tabLayout.newTab().setText("Service")); 
    tabLayout.addTab(tabLayout.newTab().setText("Gallery")); 
    tabLayout.addTab(tabLayout.newTab().setText("Contact Us")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
    final PagerAdapter adapter = new PagerAdapter 
      (getSupportFragmentManager(), tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 
} 

/*public void biggerView(View v) 
{ 
    im=(ImageView)findViewById(R.id.selected); 

    switch (v.getId()) 
    { 
     case R.id.image1: im.setImageResource(R.drawable.p1); 
      break; 
     case R.id.image2: im.setImageResource(R.drawable.p2); 
      break; 
     case R.id.image3: im.setImageResource(R.drawable.p3); 
      break; 
     case R.id.image4: im.setImageResource(R.drawable.p4); 
      break; 
     case R.id.image5: im.setImageResource(R.drawable.p5); 
      break; 
     case R.id.image6: im.setImageResource(R.drawable.p6); 
      break; 
     case R.id.image7: im.setImageResource(R.drawable.p7); 
      break; 
    } 
}*/ 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

Это ImageAdapter:

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 

public ImageAdapter(Context c) { 
    mContext = c; 
} 

public int getCount() { 
    return mThumbIds.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

// references to our images 
private Integer[] mThumbIds = { 
     /*R.drawable.p1, R.drawable.p2, 
     R.drawable.p3, R.drawable.p4, 
     R.drawable.p5, R.drawable.p6, 
     R.drawable.p7, R.drawable.p8, 
     R.drawable.p9, R.drawable.p10, 
     R.drawable.p11, R.drawable.p12, 
     R.drawable.p13, R.drawable.p14, 
     R.drawable.p15, R.drawable.p16, 
     R.drawable.p17, R.drawable.p18, 
     R.drawable.p19, R.drawable.p20, 
     R.drawable.p21, R.drawable.p22, 
     R.drawable.p23*/ 
     R.drawable.sample_0, R.drawable.sample_1, 
     R.drawable.sample_2, R.drawable.sample_3, 
     R.drawable.sample_4, R.drawable.sample_5, 
     R.drawable.sample_6, R.drawable.sample_7 
}; 
} 
+0

Насколько я понял, ваш GridView находится в вашем фрагменте (layout2 layout, а не в Activity_main).Поэтому вы должны переместить код для обработки этого в Fragment, потому что в вашей деятельности GridView недоступен. – thetonrifles

+0

вы вызываете 'getActivity()' в 'onCreateView', и вы получаете доступ к' GridView' в этой функции, что может вызвать проблему. потому что на данный момент функция getActivity не создана. Во-вторых, проверьте, что вы объявили 'GridView' в' acitivyt_main' xml –

+0

все внезапное, что нашел gridView.setAdapter появляется как в файле фрагмента.java, так и в MainActivity, и он запускался после удаления объекта в MainActivity ... – plood

ответ

1

Ваш GridViewR.id.gridview не кажется, что в макете R.layout.activity_main. Добавьте это в макет или, если вы хотите использовать фрагмент, затем загрузите фрагмент, а GridView должен находиться в макете Fragment2R.layout.fragment2.

Решение 1

Если вы решили использовать Fragment2 затем удалите следующий код из MainActivity и добавить в Fragment2

GridView gridview = (GridView) findViewById(R.id.gridview); 
gridview.setAdapter(new ImageAdapter(this)); 

gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, 
          int position, long id) { 
     Toast.makeText(MainActivity.this, "" + position, 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

Решение 2

Если вы решили не использовать Fragment2 затем добавьте следующий код: R.layout.activity_main

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/gridview" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:columnWidth="90dp" 
android:numColumns="auto_fit" 
android:verticalSpacing="10dp" 
android:horizontalSpacing="10dp" 
android:stretchMode="columnWidth" 
android:gravity="center" 
/> 

Дополнительная Предложение

изменить Также

public Object getItem(int position) { 
    return null; 
} 

в

public Object getItem(int position) { 
    return mThumbIds[position]; 
} 
+0

благодарим за ответ и предложение! Могу ли я спросить, выбрал ли я решение2, добавив GridView в Activity_main. будет ли он отображать GridView во всех трех фрагментах вместо фрагмента2? – plood

+0

Зависит. Если вы не изменили часть gridview в действии и не загрузите другие фрагменты в отдельный контейнер, это будет отображаться на всех фрагментах. – Rohit5k2

0

Насколько я понял, ваш GridView находится в вашем фрагменте (FRAGMENT2 макета, а не в activity_main). Поэтому вы должны переместить код для обработки этого в Fragment, потому что в вашей деятельности GridView недоступен.

+0

Спасибо, что ответили! ya, вы правы, я нашел код для GridView в обоих фрагментах и ​​MainActivity. но я только установил свой GridView в Fragment. это может привести к ошибке. – plood

Смежные вопросы