2011-09-29 14 views
6

Para la escuela estoy haciendo una aplicación para Android. Para esta aplicación, tengo un fragmento, que muestra una vista de cuadrícula con solo cadenas, desde una base de datos. Para esto necesito un fragmento. Cuando llamo getActivity(), devuelve null. El método onAttach, como se sugiere here, no se llama antes de que la aplicación falle. ¿Cómo debería resolver esto?
weekFragmetn.xml:getActivity devolver nulo desde el fragmento

package nl.siebeh.schoolmate; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.LayoutInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.GridView; 

public class weekFragment extends Fragment { 
    dbLayer db; 
    Context mContext; 

    @Override 
    public void onAttach(Activity activity) { 
     mContext = getActivity(); 
     Log.i("Schoolmate","onAttach called"); 
     super.onAttach(activity); 
    } 

    public weekFragment newInstance(String title) { 
     Log.i("Schoolmate","newInstance called"); 
     db = new dbLayer(mContext); 
     weekFragment fragment = new weekFragment(); 
     ArrayList<ArrayList<Object>> result = null; 

     if(title == "leraren"){ 
      result = db.getAllRowsAsArrays("weekTeacher", null); 
     }else if(title == "locatie"){ 
      result = db.getAllRowsAsArrays("weekLocation", null); 
     }else if(title == "vakken"){ 
      result = db.getAllRowsAsArrays("weekSubjects", null); 
     } 

     String[] array = new String[60]; 

     for(int i = 0; i < 60; i++){ 
      array[i] = ""; 
     } 

     array[1] = getResources().getStringArray(R.array.days)[0]; 
     array[2] = getResources().getStringArray(R.array.days)[1]; 
     array[3] = getResources().getStringArray(R.array.days)[2]; 
     array[4] = getResources().getStringArray(R.array.days)[3]; 
     array[5] = getResources().getStringArray(R.array.days)[4]; 

     for(int i = 1; i < 10; i++){ 
      array[i] = Integer.toString(i); 
     } 

     for(int position = 0; position < result.size(); position++){ 
      ArrayList<Object> row = result.get(position); 
      int hour = Integer.valueOf(row.get(1).toString()).intValue(); 
      int day = Integer.valueOf(row.get(0).toString()).intValue(); 
      int pos = 6 * hour + day; 
      array[pos] = row.get(position).toString(); 
     } 
     fragment.mContent = array; 

     return fragment; 
    } 

    private String[] mContent = {""}; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 
     View v = inflater.inflate(R.layout.week_fragment, container, false); 
     GridView gridview = (GridView) v.findViewById(R.id.gridview); 
     gridview.setAdapter(new weekAdapter(mContext, mContent)); 
     return gridview; 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
    } 



} 

Logcat: (puesto clic en el elemento del elemento de una lista que se inicia la actividad, donde se inicia/empotrado el fragmento)

09-29 19:10:56.611: INFO/ActivityManager(70): Starting: Intent { cmp=nl.siebeh.schoolmate/.overviewWeek } from pid 536 
09-29 19:10:56.970: INFO/Schoolmate(536): newInstance called 
09-29 19:11:06.631: WARN/ActivityManager(70): Launch timeout has expired, giving up wake lock! 
09-29 19:11:06.671: WARN/ActivityManager(70): Activity idle timeout for HistoryRecord{40770188 nl.siebeh.schoolmate/.overviewWeek} 
09-29 19:12:20.661: DEBUG/SntpClient(70): request time failed: java.net.SocketException: Address family not supported by protocol 
09-29 19:14:11.811: DEBUG/dalvikvm(536): Debugger has detached; object registry had 413 entries 
09-29 19:14:11.811: ERROR/SchoolMate(536): java.lang.NullPointerException 
09-29 19:14:11.811: INFO/SchoolMate(536): Context is null 
09-29 19:14:11.820: WARN/System.err(536): java.lang.NullPointerException 
09-29 19:14:11.820: WARN/System.err(536):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
09-29 19:14:11.820: WARN/System.err(536):  at nl.siebeh.schoolmate.dbLayer.<init>(dbLayer.java:50) 
09-29 19:14:11.820: WARN/System.err(536):  at nl.siebeh.schoolmate.weekFragment.newInstance(weekFragment.java:31) 
09-29 19:14:11.820: WARN/System.err(536):  at nl.siebeh.schoolmate.fragmentAdapter.getItem(fragmentAdaptar.java:21) 
09-29 19:14:11.820: WARN/System.err(536):  at nl.siebeh.schoolmate.titleFragmentAdapter.getItem(titleFragmentAdapter.java:1) 
09-29 19:14:11.820: WARN/System.err(536):  at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:62) 
09-29 19:14:11.820: WARN/System.err(536):  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:321) 
09-29 19:14:11.820: WARN/System.err(536):  at android.support.v4.view.ViewPager.populate(ViewPager.java:441) 
09-29 19:14:11.820: WARN/System.err(536):  at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.View.dispatchAttachedToWindow(View.java:6156) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1122) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.820: WARN/System.err(536):  at android.view.ViewRoot.performTraversals(ViewRoot.java:765) 
09-29 19:14:11.830: WARN/System.err(536):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
09-29 19:14:11.840: WARN/System.err(536):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 19:14:11.840: WARN/System.err(536):  at android.os.Looper.loop(Looper.java:123) 
09-29 19:14:11.840: WARN/System.err(536):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
09-29 19:14:11.840: WARN/System.err(536):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 19:14:11.840: WARN/System.err(536):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-29 19:14:11.850: WARN/System.err(536):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-29 19:14:11.850: WARN/System.err(536):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-29 19:14:11.850: WARN/System.err(536):  at dalvik.system.NativeStart.main(Native Method) 
09-29 19:14:11.850: DEBUG/AndroidRuntime(536): Shutting down VM 
09-29 19:14:11.850: WARN/dalvikvm(536): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536): FATAL EXCEPTION: main 
09-29 19:14:11.870: ERROR/AndroidRuntime(536): java.lang.NullPointerException 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at nl.siebeh.schoolmate.weekFragment.newInstance(weekFragment.java:49) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at nl.siebeh.schoolmate.fragmentAdapter.getItem(fragmentAdaptar.java:21) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at nl.siebeh.schoolmate.titleFragmentAdapter.getItem(titleFragmentAdapter.java:1) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:62) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:321) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.support.v4.view.ViewPager.populate(ViewPager.java:441) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.View.dispatchAttachedToWindow(View.java:6156) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1122) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewRoot.performTraversals(ViewRoot.java:765) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.os.Looper.loop(Looper.java:123) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-29 19:14:11.870: ERROR/AndroidRuntime(536):  at dalvik.system.NativeStart.main(Native Method) 
09-29 19:14:11.890: WARN/ActivityManager(70): Force finishing activity nl.siebeh.schoolmate/.overviewWeek 
09-29 19:14:12.413: WARN/ActivityManager(70): Activity pause timeout for HistoryRecord{40770188 nl.siebeh.schoolmate/.overviewWeek} 
09-29 19:14:21.910: WARN/ActivityManager(70): Launch timeout has expired, giving up wake lock! 
09-29 19:14:22.441: WARN/ActivityManager(70): Activity idle timeout for HistoryRecord{4070c7a0 nl.siebeh.schoolmate/.schoolmate} 
09-29 19:14:32.451: WARN/ActivityManager(70): Activity destroy timeout for HistoryRecord{40770188 nl.siebeh.schoolmate/.overviewWeek} 

Respuesta

8

No hacer tiene una llamada getActivity(), lo que hace que sea difícil responder a la pregunta.

Obtiene un NullPointerException porque mContext es null. Supongo que mContext es null porque, en el código fragmentAdapter, está llamando al new weekFragment(), y luego llama al newInstance(). Presumiblemente pensó que estaba siguiendo algunos patrones descritos en el Fragment JavaDocs, pero allí, newInstance() es un método static, no un método de instancia como el que tiene aquí.

Tome casi todo el código de newInstance() y muévalo a onActivityCreated() o en algún momento cuando el fragmento se adjunta a la actividad para que getActivity() funcione. En el camino, elimine su implementación onAttach() y el miembro de datos mContext, ninguno de los cuales es necesario (y el mContext está poblado de una manera muy aterradora).

+0

Gracias por la respuesta rápida. En onAttach debería el mContext establecerse en getActivity(), lo que es ahora es algo que encontré en otro sitio. Voy a probarlo de inmediato. – Siebe

+0

@Swilzard: "En onAttach debe el mContext establecerse en getActivity()" - no, simplemente llame a 'getActivity()' cuando necesite 'Activity'. – CommonsWare

+0

@CommonsWare: en mi caso estoy lanzando un fragmento al hacer clic en el botón ... así que aquí se supone que la actividad ya se ha creado. pero ahora aquí si call getActivity(). finish() from fragment ... está dando NULL POINTER ... cualquier sugerencia.? – CoDe

Cuestiones relacionadas