为什么我的片段无法加载正确的视图?

问题描述:

我有涉及使用根据其状态的两个XML文件的片段。因此,我希望设定一个观点“如果”一个班是活跃的“其他”我希望它设置另一个观点。但是我正在遇到的错误,有在logcat中图所示为什么我的片段无法加载正确的视图?

public class MainInstagramActivity extends Fragment { 
private InstagramSession mInstagramSession; 
private Instagram mInstagram; 

private ProgressBar mLoadingPb; 
private GridView mGridView; 

private static final String CLIENT_ID = ""; 
private static final String CLIENT_SECRET = ""; 
private static final String REDIRECT_URI = ""; 



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

if (mInstagramSession.isActive()) { 
    View view = LayoutInflater.from(getActivity()).inflate(
      R.layout.activity_user_instagram, null); 
    return view; 
} 
else { 
    View view = LayoutInflater.from(getActivity()).inflate(
      R.layout.activity_main_instagram, null); 

    return view; 
} 
} 

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

mInstagram   = new Instagram(getActivity(), CLIENT_ID, CLIENT_SECRET, REDIRECT_URI); 

mInstagramSession = mInstagram.getSession(); 

if (mInstagramSession.isActive()) { 
    View view = LayoutInflater.from(getActivity()).inflate(
      R.layout.activity_user_instagram, null); 




    InstagramUser instagramUser = mInstagramSession.getUser(); 

    mLoadingPb = (ProgressBar)container.findViewById(R.id.pb_loading); 
    mGridView = (GridView)container.findViewById(R.id.gridView); 

    ((TextView) container.findViewById(R.id.tv_name)).setText(instagramUser.fullName); 
    ((TextView) container.findViewById(R.id.tv_username)).setText(instagramUser.username); 

    ((Button) container.findViewById(R.id.btn_logout)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      mInstagramSession.reset(); 

      startActivity(new Intent(getActivity(), MainInstagramActivity.class)); 

      getActivity().getFragmentManager().popBackStack(); 
     } 
    }); 

    ImageView userIv = (ImageView) container.findViewById(R.id.iv_user); 

    DisplayImageOptions displayOptions = new DisplayImageOptions.Builder() 
      .showImageOnLoading(R.drawable.ic_user) 
      .showImageForEmptyUri(R.drawable.ic_user) 
      .showImageOnFail(R.drawable.ic_user) 
      .cacheInMemory(true) 
      .cacheOnDisc(false) 
      .considerExifParams(true) 
      .build(); 

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()) 
      .writeDebugLogs() 
      .defaultDisplayImageOptions(displayOptions) 
      .build(); 

    ImageLoader imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(config); 

    AnimateFirstDisplayListener animate = new AnimateFirstDisplayListener(); 

    imageLoader.displayImage(instagramUser.profilPicture, userIv, animate); 

    new DownloadTask().execute(); 



} else { 

    View view = LayoutInflater.from(getActivity()).inflate(
      R.layout.activity_main_instagram, null); 

    ((Button) container.findViewById(R.id.btn_connect)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      mInstagram.authorize(mAuthListener); 
     } 
    }); 

} 
} 

logcat的命名mInstagramSession

09-22 10:41:31.065  986-986/com.virtualinsomniac.annaakana E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.virtualinsomniac.annaakana, PID: 986 
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean   instagramlibrary.InstagramSession.isActive()' on a null object reference 
    at com.virtualinsomniac.annaakana.Instagram.MainInstagramActivity.onCreateView(MainInstagramActivity.java:63) 
    at android.app.Fragment.performCreateView(Fragment.java:1704) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1063) 
    at android.app.BackStackRecord.run(BackStackRecord.java:684) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1448) 
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
    at android.os.Handler.handleCallback(Handler.java:738) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5070) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631) 

控制进入onViewCreated之前onCreateView。这是你得到错误的原因。初始化onCreateView中的instagram和instagramsession对象。它应该可以正常工作!

把这些线在onCreateView方法

mInstagram =新的Instagram(getActivity(),CLIENT_ID,CLIENT_SECRET,REDIRECT_URI);

mInstagramSession = mInstagram.getSession();

你的对象为null在onCreateView空对象。你应该首先启动InstagramSession。

我认为onCreateViewonViewCreated之前执行。这就是为什么你的参考为空。

onViewCreated文档:

onCreateView后立即调用(LayoutInflater,ViewGroup中, 束)返回

+1

名字还挺建议呢! ;) – BenjaminPaul 2014-09-23 13:44:24