0

지옥, 임이 수행하여 fragmentActivity를 시작하려고 : 다른 조각 활동에서시작 조각 활동은 null을 반환 - getactivity의 조각에

Intent intent = new Intent(this, CircleListActivity.class); 
       intent.putExtra("cats", cats); 
       startActivity(intent); 
       finish(); 

을하고 난 로그 캣이를 얻을 수행 할 때

09-02 22:54:03.093: E/AndroidRuntime(2943): java.lang.NullPointerException 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at com.example.masterdetailsexample.adapter.SampleAdapter.<init>(SampleAdapter.java:30) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at com.example.masterdetailsexample.CircleListFragment$2.onPostExecute(CircleListFragment.java:84) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at com.example.masterdetailsexample.CircleListFragment$2.onPostExecute(CircleListFragment.java:1) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.os.Looper.loop(Looper.java:176) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at android.app.ActivityThread.main(ActivityThread.java:5365) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
09-02 22:54:03.093: E/AndroidRuntime(2943):  at dalvik.system.NativeStart.main(Native Method) 

나는 내가 오류가 여기에서 발생 CircleListFragment.java:84 또는 adapter = new SampleAdapter(getActivity(), devices); 볼 테스트 할 때 - 내가 테스트를 봤는데, getActivity()이 null를 돌려 보았다. 누군가 이런 일이 왜 일어 났는지 말해 줄 수 있습니까?

public class CircleListFragment extends ListFragment { 

    private static final String STATE_ACTIVATED_POSITION = "activated_position"; 
    private Callbacks mCallbacks = sDummyCallbacks; 
    private int mActivatedPosition = ListView.INVALID_POSITION; 
    private ArrayList<Device> devices; 
    private SharedPreferences prefs; 
    boolean paused = false; 
    int index, top; 
    private SampleAdapter adapter; 

    public interface Callbacks { 
     public void onItemSelected(int id, ArrayList<Device> devices); 
    } 

    private static Callbacks sDummyCallbacks = new Callbacks() { 
     @Override 
     public void onItemSelected(int id, ArrayList<Device> devices) { 
     } 
    }; 

    public CircleListFragment() { 
    } 

    @Override 
    public void onPause() { 
     paused = true; 
     index = getListView().getFirstVisiblePosition(); 
     View v = getListView().getChildAt(0); 
     top = (v == null) ? 0 : v.getTop(); 
     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     if (adapter != null && devices != null) { 
      for (int i = 0; i < devices.size(); i++) { 
       devices.get(i).setChecked(false); 
      } 
      adapter.notifyDataSetChanged(); 
     } 
     super.onResume(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     devices = new ArrayList<Device>(); 
     prefs = getActivity().getSharedPreferences(
       getActivity().getPackageName(), Context.MODE_PRIVATE); 

     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       getJSONFromUrl(Constants.DEVICES_URL); 
       return null; 
      } 

      protected void onPostExecute(Void result) { 
       Log.v("--", getActivity()+" | "+devices); 
       adapter = new SampleAdapter(getActivity(), devices); 
       setListAdapter(adapter); 
       getListView().setDivider(
         getActivity().getResources().getDrawable(
           R.drawable.transperent_color)); 
       getListView().setDividerHeight(20); 
       if (Constants.isTablet(getActivity())) 
        getListView().setPadding(20, 20, 20, 20); 
       else 
        getListView().setPadding(10, 10, 10, 10); 

      }; 
     }.execute(); 

    } 

    public void getJSONFromUrl(String url) { 

     try { 
      JSONParser jParser = new JSONParser(); 
      // get JSON data from URL 
      JSONArray jArray = jParser.getJSONArrayFromUrl(url); 
      // Log.v("--", jArray.toString()); 
      for (int i = 0; i < jArray.length(); i++) { 

       JSONObject j = jArray.getJSONObject(i); 
       JSONArray arr = j.getJSONArray("devices"); 
       ArrayList<SubDevice> subDevices = new ArrayList<SubDevice>(); 
       for (int k = 0; k < arr.length(); k++) { 
        JSONObject o = arr.getJSONObject(k); 
        subDevices.add(new SubDevice(o.getInt("id"), o 
          .getString("text"), o.getString("title"), false)); 
       } 
       devices.add(new Device(j.getString("title"), j.getInt("id"), 
         subDevices, false)); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     if (savedInstanceState != null 
       && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { 
      setActivatedPosition(savedInstanceState 
        .getInt(STATE_ACTIVATED_POSITION)); 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      getListView().setDivider(
        getResources().getDrawable(R.drawable.transperent_color)); 
      getListView().setDividerHeight(20); 

     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     if (!(activity instanceof Callbacks)) { 
      throw new IllegalStateException(
        "Activity must implement fragment's callbacks."); 
     } 

     mCallbacks = (Callbacks) activity; 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 

     mCallbacks = sDummyCallbacks; 
    } 

    @Override 
    public void onListItemClick(ListView listView, View view, int position, 
      long id) { 
     super.onListItemClick(listView, view, position, id); 
     mCallbacks.onItemSelected(position, devices); 
     Log.v("--", 
       "IS CHECKED" + prefs.getString(devices.get(position) + "", "")); 
     for (int i = 0; i < devices.size(); i++) { 
      devices.get(i).setChecked(false); 
      if (prefs.getString(devices.get(i) + "", "").length() > 0) { 
       listView.setItemChecked(i, true); 
       Log.v("--", "checking " + i); 
      } 
     } 
     devices.get(position).setChecked(true); 

     listView.setItemChecked(position, true); 
     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     if (mActivatedPosition != ListView.INVALID_POSITION) { 
      outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); 
     } 
    } 

    public void setActivateOnItemClick(boolean activateOnItemClick) { 
     getListView().setChoiceMode(
       activateOnItemClick ? ListView.CHOICE_MODE_MULTIPLE 
         : ListView.CHOICE_MODE_NONE); 
    } 

    private void setActivatedPosition(int position) { 
     if (position == ListView.INVALID_POSITION) { 
      getListView().setItemChecked(mActivatedPosition, false); 
     } else { 
      getListView().setItemChecked(position, true); 
     } 

     mActivatedPosition = position; 
    } 
} 

그리고 CircleListActivity 클래스 :

여기 내 코드입니다 onPostExecute() 방법에 널 (null)

public class CircleListActivity extends FragmentActivity implements 
     CircleListFragment.Callbacks { 

    private Button proceed; 
    private boolean mTwoPane; 
    // private ArrayList<Device> devices; 
    private ArrayList<Categories> categories; 
    SharedPreferences prefs; 
    private ArrayList<Device> devices; 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_circle_list); 
     if (Constants.isTablet(this)) { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     } else { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
     prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE); 
     initActionBar(); 

     if (!prefs.getBoolean(Constants.DEVICES_INTRO, false) 
       && Constants.isTablet(this)) { 
      Intent in = new Intent(this, DevicesIntro.class); 
      startActivity(in); 
      prefs.edit().putBoolean(Constants.DEVICES_INTRO, true).commit(); 
     } 

     devices = new ArrayList<Device>(); 
     devices = (ArrayList<Device>) getIntent().getSerializableExtra(
     Constants.DEVICES_EXTRA); 
     categories = (ArrayList<Categories>) getIntent().getSerializableExtra(
       "cats"); 

     proceed = (Button) findViewById(R.id.list_proceed); 
     proceed.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(CircleListActivity.this, 
         TestSearch.class); 
       intent.putExtra("fromDevs", true); 
       prefs.edit().putBoolean("fromDevs", true).commit(); 
       intent.putExtra("cats", categories); 
       // intent.putExtra(Constants.DEVICES_DETAIL_EXTRA, devices); 
       if (prefs.getBoolean("set", false)) { 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(intent); 
        prefs.edit().putBoolean("set", true).commit(); 

       } 
       prefs.edit().putBoolean("set", true).commit(); 

       startActivity(intent); 
       finish(); 
      } 
     }); 
     if (findViewById(R.id.circle_detail_container) != null) { 
      mTwoPane = true; 

      ((CircleListFragment) getSupportFragmentManager().findFragmentById(
        R.id.circle_list)).setActivateOnItemClick(true); 
      Log.v("--", "circle activity tw"); 
     } 

     // TODO: If exposing deep links into your app, handle intents here. 
    } 

    @Override 
    public void onItemSelected(int position, ArrayList<Device> devices) { 
     if (mTwoPane) { 

      Bundle arguments = new Bundle(); 
      arguments.putSerializable(Constants.DEVICES_DETAIL_EXTRA, this.devices 
        .get(position).getDevices()); 
      arguments.putInt(Constants.PARENT, this.devices.get(position).getId()); 
      CircleDetailFragment fragment = new CircleDetailFragment(); 
      fragment.setArguments(arguments); 
      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.circle_detail_container, fragment).commit(); 

     } else { 
      Intent detailIntent = new Intent(this, CircleDetailActivity.class); 
      detailIntent.putExtra(Constants.DEVICES_DETAIL_EXTRA, 
        this.devices.get(position).getDevices()); 
      detailIntent.putExtra(Constants.PARENT, this.devices.get(position) 
        .getId()); 
      Log.v("--", devices.get(position).getId() + " }}"); 
      startActivity(detailIntent); 
     } 
    } 

    private void initActionBar() { 

     getActionBar().setBackgroundDrawable(
       new ColorDrawable(Color.parseColor("#e91a34"))); 

     getActionBar().setCustomView(R.layout.actionbar_custom_view_home); 
     // actionBar.setcu 
     getActionBar().setDisplayShowTitleEnabled(false); 
     getActionBar().setDisplayShowCustomEnabled(true); 
     getActionBar().setDisplayUseLogoEnabled(false); 
     getActionBar().setDisplayShowHomeEnabled(false); 

     // getActionBar().setHomeButtonEnabled(true); 
     // getActionBar().setIcon(R.drawable.menu); 
    } 
} 
+0

onActivityCreated()에서 getActivity()를 호출해도 여전히 null이 반환됩니까? –

+1

asynctask가 null이 아니고 getactivity가 작동하지 않아야합니다. –

+0

@Rod_Algonquin 당신은 어떻게 당신을 의미합니까? –

답변

0

onCreate 메서드에서 getActivity().getSharedPreferences을 직접 사용할 수 있으므로 getActivity는 실제로 null이 아니므로 null이 아닙니다.

0

getActivity()하면 반환, 조각이 부착되어 있지 않습니다. 충돌을 막기 위해 널 체크를 수행하고 조각이 분리 된 이유를 조사해야합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 코드를 작성하면 어떻게 할 수 있습니까? 나는 그 문제를 아주 잘 이해하지 못한다. –

관련 문제