2011-09-29 6 views
6

학교용으로 안드로이드 앱을 만들고 있습니다. 이 응용 프로그램에 대한 데이터베이스에서 그냥 문자열로 gridview 보여주는 조각 있습니다. 이를 위해서는 조각이 필요합니다. getActivity()를 호출하면 null을 반환합니다. 제안 된대로 here과 같은 onAttach 메서드는 응용 프로그램이 충돌하기 전에 호출되지 않습니다. 어떻게 해결해야합니까?
weekFragmetn.xml :getActivity는 조각에서 null을 반환합니다.

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



} 

로그 캣 (항목을 클릭 이후 조각이/시작 내장되어 활동, 시작 목록에서 항목)

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} 

답변

8

당신은하지 않습니다 의 전화 번호는getActivity()입니다.이 질문에 대답하기가 어렵습니다.

mContextnull이기 때문에 NullPointerException이 표시됩니다. 내 생각 엔 fragmentAdapter 코드에 new weekFragment()을 호출하고 newInstance()을 호출하기 때문에 mContextnull입니다. 아마도 Fragment JavaDocs에 설명 된 일부 패턴을 따르고 있다고 생각했을 것입니다.하지만 거기에 newInstance()static 메소드입니다. 여기서는 인스턴스 메소드가 아닙니다.

newInstance()의 코드를 모두 가져 와서 onActivityCreated()으로 옮기거나 조각이 액티비티에 첨부되어있는 때가 있으므로 getActivity() 코드가 작동합니다. 길을 따라 onAttach() 구현과 mContext 데이터 멤버를 삭제하십시오. 어느 누구도 필요하지 않습니다. mContext은 매우 무서운 방법으로 채워집니다.

+0

빠른 응답을 보내 주셔서 감사합니다. onAttach에서 mContext를 getActivity()로 설정해야합니다. 이제는 다른 사이트에서 찾은 것입니다. 나는 그것을 즉시 시도 할 것이다. – Siebe

+0

@Swilzard : "onAttach에서 mContext를 getActivity()로 설정해야합니다"- 아니요, 'Activity'가 필요할 때'getActivity()'를 호출하십시오. – CommonsWare

+0

@CommonsWare : 제 경우에는 버튼 클릭으로 조각을 시작합니다. 여기서는 이미 생성 된 활동을 가정합니다. 하지만 지금 여기에서 getActivity(). finish()를 호출하면 fragment.it에서 NULL POINTER ... 제안을 제공합니다.? – CoDe

관련 문제