2014-04-08 73 views
0

我試圖開發一個依賴於Web服務的Android應用程序,我使用片段來讓我的應用程序在移動設備和平板電腦上運行。 。java.lang.NullPointerException當我嘗試獲取片段之間的數據android

這是保持在兩種模式下的片段,並檢查哪個模式 然後定義依賴於在其中模式,詳細信息顯示在一個DetailFragment(橫向)onItemClickListener或DetailActivity(肖像)

public class AppelsFragment extends Fragment implements AdapterView.OnItemClickListener { 
    boolean mDualPane; 
    int mCurCheckPosition = 0; 

    public static List<Appel> appels = null; 
    ListView mListView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.list_fragment, container, false); 

     return view; 
    } 

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

     mListView = (ListView) getActivity().findViewById(R.id.listAppels); 

     if (this.mListView != null) { 
      this.mListView.setOnItemClickListener(this); 
      this.mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     } 

     // this is an asynctask that retreive data from RestAPI and set the Adapter for my listview 
     new Appels().execute(); 


     View detailsFrame = getActivity().findViewById(R.id.details); 


     mDualPane = detailsFrame != null 
       && detailsFrame.getVisibility() == View.VISIBLE; 


     if (savedInstanceState != null) { 
      // Restore last state for checked position. 
      mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
     } 

     if (mDualPane) { 

      showDetails(mCurCheckPosition); 
     } else { 
      mListView.setItemChecked(mCurCheckPosition, true); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putInt("curChoice", mCurCheckPosition); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> l, View v, int position, long id) { 

     showDetails(position); 
    } 


    void showDetails(int index) { 
     mCurCheckPosition = index; 

     if (mDualPane) { 

      mListView.setItemChecked(index, true); 

      DetailsFragment details = (DetailsFragment) getFragmentManager() 
        .findFragmentById(R.id.details); 
      if (details == null || details.getShownIndex() != index) { 

       details = DetailsFragment.newInstance(index); 

       FragmentTransaction ft = getFragmentManager() 
         .beginTransaction(); 
       ft.replace(R.id.details, details); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
      } 

     } else { 

      Intent intent = new Intent(); 

      intent.setClass(getActivity(), DetailsActivity.class); 

      intent.putExtra("index", index); 

      startActivity(intent); 
     } 
    } 

class Appels extends AsyncTask<String, Void, List<Appel>> { 
..... } 
} 
活性

我面對的問題是DetailFragment中的NullPointerException,在肖像模式下我hav E無問題

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.marocbusiness11.app/com.mycompany.marocbusiness11.app.FragmentLayout}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at com.mycompany.marocbusiness11.app.DetailsFragment.onCreateView(DetailsFragment.java:42) 
      at android.app.Fragment.performCreateView(Fragment.java:1700) 
      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
      at android.app.BackStackRecord.run(BackStackRecord.java:684) 
      at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
      at android.app.Activity.performStart(Activity.java:5240) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
            at android.app.ActivityThread.access$800(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5017) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 

這是對DetailFragment

public class DetailsFragment extends Fragment { 

    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

    public int getShownIndex() { 
     return getArguments().getInt("index", 0); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     if(container == null) 
      return null; 

     View v = inflater.inflate(R.layout.details,container,false); 
     TextView txtAffichage = (TextView) v.findViewById(R.id.txtAffichage); 
     txtAffichage.setText(AppelsFragment.appels.get(getShownIndex()).getNumOrdre().toString()); 

     return v; 

    } 
} 

的問題,通過這個指令

txtAffichage.setText(AppelsFragment.appels.get(getShownIndex()).getNumOrdre().toString()); 

我想我定義我的列表的方式,是

觸發代碼
public static List<Appel> appels = null; 

可能是這個問題的原因,如果有我怎麼能應付任何建議 或者我應該改變

由於提前

///////帖子編輯

在我使用DetailsActivity肖像模式實例化DetailsFragment所以它總是對碎片..

這是對DetailsActivity

代碼

和details.xml佈局

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

     <TextView 
      android:id="@+id/txtAffichage" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

</LinearLayout> 

回答

0

我已經編輯我的職務,以添加一些代碼,但一些研究(herehere)後,糾正我,如果我錯了..在我的AsyncTask相關片段的問題,asnycTask負責獲得的來自Rest API的數據列表,列出了我試圖在我的片段中顯示和處理的數據,由於連接和網絡質量導致的asyncTask無法在片段嘗試顯示它們之前檢索數據。

時,該指令被觸發

TextView txtAffichage = (TextView) v.findViewById(R.id.txtAffichage); 
     txtAffichage.setText(AppelsFragment.appels.get(getShownIndex()).getNumOrdre().toString()); 

名單appels仍然是空的並從那裏例外NullPointerException ..

我認爲裝載機是解決這個問題,糾正我,如果它不是..

0

這條線:

TextView txtAffichage = (TextView) v.findViewById(R.id.txtAffichage); 

可能是返回null。確保R.id.txtAffichage在佈局資源文件的兩個版本(縱向和橫向)中都有效。

相關問題