7

Acabo de comenzar a desarrollar en la plataforma Android después de desarrollar en iOS. He mirado alrededor y parece que no puedo resolverlo. Estoy tratando de que aparezca una vista de cuadrícula después de seleccionar una pestaña en la barra de acciones. El fragmento se visualiza a través de una actividad principal que controla la barra de pestañas. Creo que el problema puede tener algo que ver con pasar el contexto, pero no estoy seguro.Imagen GridView Inside Fragment

Aquí está mi MainActivity.java. Aquí es donde el fragmento se inicializa y se adjunta a la actividad. Funciona sin el código en el fragmento.

if (mFragment == null){ 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content,mFragment,mTag); 
     } else { 
      ft.attach(mFragment); 
     } 

Aquí es mi PhotosFragment.java Aquí es donde quiero la vista de cuadrícula que se rellena y se muestra.

public class PhotosFragment extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     GridView gridview = (GridView) this.getActivity().findViewById(R.id.photogridview); 
     gridview.setAdapter(new PhotoImageAdapter(this.getActivity())); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 
} 

Aquí es mi PhotoImageAdapter.java clase. Aquí es donde las imágenes se agregan al adaptador, creo.

public class PhotoImageAdapter extends BaseAdapter { 
    private Context mContext; 

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

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

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

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

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

    private Integer[] mThumbIds = { 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      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, 
      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 
    }; 
} 

Y aquí es mi photos_layout que contiene el gridview con el photogridview ID. photos_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/photogridview" 
    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"> 
</GridView> 

EDITAR

Aquí está el informe de registro cuando se rompe

05-29 14:15:43.895: W/dalvikvm(676): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
05-29 14:15:43.925: E/AndroidRuntime(676): FATAL EXCEPTION: main 
05-29 14:15:43.925: E/AndroidRuntime(676): java.lang.NullPointerException 
05-29 14:15:43.925: E/AndroidRuntime(676): at com.corecoders.PhotosFragment.onCreate(PhotosFragment.java:21) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:795) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.BackStackRecord.run(BackStackRecord.java:622) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.os.Handler.handleCallback(Handler.java:605) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.os.Looper.loop(Looper.java:137) 
05-29 14:15:43.925: E/AndroidRuntime(676): at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-29 14:15:43.925: E/AndroidRuntime(676): at java.lang.reflect.Method.invokeNative(Native Method) 
05-29 14:15:43.925: E/AndroidRuntime(676): at java.lang.reflect.Method.invoke(Method.java:511) 
05-29 14:15:43.925: E/AndroidRuntime(676): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-29 14:15:43.925: E/AndroidRuntime(676): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-29 14:15:43.925: E/AndroidRuntime(676): at dalvik.system.NativeStart.main(Native Method) 
05-29 14:15:44.494: I/dalvikvm(676): threadid=3: reacting to signal 3 
05-29 14:15:44.514: I/dalvikvm(676): Wrote stack traces to '/data/anr/traces.txt' 
05-29 14:20:43.995: I/Process(676): Sending signal. PID: 676 SIG: 9 

la aplicación se bloquea cuando se hace clic en la ficha y el fragmento se inicializa. El tutorial que estoy siguiendo es el que está en el sitio android developers.

Cualquier ayuda o explicación sería increíble. Como dije, soy nuevo en esto, así que sería genial tener algunos consejos para ayudarme a entender qué está pasando.

Disco

+0

Te faltan ft.commit() después de ft.add(). – ania

+0

Y también necesita el método onCreateView en fragmento; debería leer esto: http: //developer.android.com/guide/topics/fundamentals/fragments.html – ania

+0

Ok, gracias por estas sugerencias, sin embargo, todavía estoy solucionando el problema en este point gridview.setAdapter (nuevo PhotoImageAdapter (this.getActivity())); – StuStirling

Respuesta

20

Resulta que unos simples modificaciones al código original y funciona.

Después de depurar y configurar los puntos de interrupción, pude encontrar que el contexto en el PhotoImageAdapter era un puntero nulo y, por lo tanto, causaba que la aplicación fallara. Fue la forma en que estaba inicializando el adaptador en mi PhotoFragment y también el método en el que lo estaba inicializando. A continuación se muestra el código que funciona correctamente para cualquier otra persona que tenga problemas con esto.

@Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.photos_layout,container,false); 
     GridView gridView = (GridView) view.findViewById(R.id.photogridview); 
     gridView.setAdapter(new MyAdapter(view.getContext())); // uses the view to get the context instead of getActivity(). 
     return view; 
    } 

De nuevo, esto podría no ser el mejor o el único de hacerlo pero de esta manera trabajado para mí. (PhotoImageAdapter.java tenía un cambio de nombre en MyAdapter.java)

1

hola el código que acabo de compartir, hice el fragmento con la vista de cuadrícula, así que con suerte te será útil consultar este enlace, allí encontrarás detalles completos sobre Implementación gridview con fragmento para dispositivo y tableta todo lo mejor

verifique estos archivos principalmente en mi respuesta que seguro le será útil MasterFragment, MasterGridActivity, MyAdapter, gridview.xml

How to Show Different Layouts inside Fragments