2014-04-08 36 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在布局资源文件的两个版本(纵向和横向)中都有效。

相关问题