2015-07-04 29 views
0

我作爲android開發人員(目前是PHP程序員)非常新。我試圖通過遵循谷歌開發人員和其他網站的各種教程來學習android。不能從活動的片段中獲取包參數

我的問題是,我不能在我的片段中獲取捆綁參數,這是在我的活動中設置的。

這裏是我的HomeActivity的方法:

public void SelectItem(int possition) { 
    Fragment fragment = new FragmentImageList(); 
    Bundle bundle = new Bundle(); 
    if (possition <= 3) { 

     bundle.putString("test_string", "Hello test"); 
     fragment.setArguments(bundle); 
     FragmentManager frgManager = getFragmentManager(); 
     frgManager.beginTransaction().replace(R.id.image_list_frame, fragment) 
       .commit(); 
    } 

} 

這裏是我的FragmentImageList片段:

public FragmentImageList() { 

} 

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


    String strtext=getArguments().getString("test_string"); 
    Log.d("test string",strtext); 
    Bundle bundle = this.getArguments(); 
    Log.d(TAG, bundle.getString("test_string")); 
    View view = inflater.inflate(R.layout.fragment_image_list, container, 
      false); 
    GridView gridView = (GridView) view.findViewById(R.id.gridView); 
    gridView.setAdapter(new GridViewAdapter()); 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      String url = (String) view.getTag(); 
      Log.d(TAG, url); 
      Intent intent = new Intent(view.getContext(), DetailActivity.class); 
      intent.putExtra("EXTRA_IMAGE", url); 
      startActivity(intent); 


     } 
    }); 
    return view; 
} 

我的錯誤日誌

07-04 22:16:49.908 1200-1200/? E/NetworkScheduler.SchedulerReceiver﹕ Invalid parameter app 
    07-04 22:16:49.908 1200-1200/? E/NetworkScheduler.SchedulerReceiver﹕ Invalid package name : Perhaps you didn't include a PendingIntent in the extras? 
    07-04 22:16:50.033 14550-14550/? E/PhotosPlugin﹕ Loading PhotosPlugin 
    07-04 22:16:50.480 14620-14620/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.sujit.wallpapersnepal, PID: 14620 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sujit.wallpapersnepal/com.sujit.wallpapersnepal.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    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:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
    at com.sujit.wallpapersnepal.FragmentImageList.onCreateView(FragmentImageList.java:37) 
    at android.app.Fragment.performCreateView(Fragment.java:2053) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
    at android.app.BackStackRecord.run(BackStackRecord.java:834) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 
    at android.app.Activity.performStart(Activity.java:6005) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:135) 
                at android.app.ActivityThread.main(ActivityThread.java:5254) 
                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:903) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
    07-04 22:16:52.006 14729-14729/? E/SysUtils﹕ ApplicationContext is null in ApplicationStatus 
    07-04 22:16:52.782 14820-14820/? E/ObjectHelper﹕ Can't find method:setCompatibilityInfo 
    07-04 22:16:54.497 15063-15063/? E/SysUtils﹕ ApplicationContext is null in ApplicationStatus 
    07-04 22:16:54.613 1200-1200/? E/NetworkScheduler.SchedulerReceiver﹕ Invalid parameter app 

字符串strText的= getArguments()的getString ( 「test_string」);不行。我也試過 Bundle bundle = this.getArguments(); Log.d(TAG,bundle.getString(「test_string」));但它也不起作用。但是,如果我評論這些捆綁線,那麼應用程序運行良好,沒有錯誤。這個「test_string」只是我試圖使它工作的一個測試參數。所以,我想知道我做了什麼錯誤,竟然放棄了我這個錯誤

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sujit.wallpapersnepal/com.sujit.wallpapersnepal.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 

編輯:我想在我的Nexus 5的Android版本上運行這個程序5.1.1

+0

你聲明片段在佈局呢? – Blackbelt

+0

@Blackbelt,在我activity_home佈局是的,我已宣佈片段<的FrameLayout 機器人:ID = 「@ + ID/image_list_frame」 機器人:layout_width = 「match_parent」 機器人:layout_height = 「match_parent」/> –

回答

2

考慮使用工廠方法就像在fragments guide(接近底部)一樣。這樣做的原因可以找到here.

在你的FragmentImageList片段中添加下面的靜態方法。

public static FragmentImageList newInstance(String string) { 
    FragmentImageList f = new FragmentImageList(); 

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

    return f; 
} 

和修改你的onCreate()方法,像這樣

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString("test_string"); 
    } 
} 

而在你SelectItem方法,

Fragment fragment = FragmentImageList.newInstance("Hello test"); 
+1

Thankx爲回覆。我試過你的解決方案,但它拋出相同的錯誤信息。我想我不能在我的片段中的任何地方使用bundle。什麼可能是這個問題? –

0

你能嘗試改變這一行

捆綁包=此。 getArguments();

字符串值= getArguments()的getString( 「鑰匙」)。 Log.i(「ANDROID」,value);

而且我不知道,你是否應該得到捆,然後膨脹的觀點, 做倒過來,先膨脹的看法,然後採取捆綁

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     Log.d(MainActivity.TAG,"Fragment onCreateView()"); 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     String value = getArguments().getString("key"); 
     Log.i("ANDROID",value); 

     return rootView; 

    }