2015-03-03 42 views
4

我有一個活動,它通過採用者類實例化和填充片段。我想傳遞值/對象到這個片段採用者類,以便我可以口授佈局等。如何將參數傳遞到活動的片段

我試過使用setArgument方法傳遞包,但我的代碼炸彈出來,不知道爲什麼。據我所知,我可以在採用者類的onCreate方法中收集該包。我看到參數在註釋代碼之後立即被正確設置,但是之後它崩潰了,我不明白爲什麼。如果我刪除了捆綁代碼,它不會崩潰。 :(

下面是我的代碼,沒有任何人知道我應該把包代碼,註釋掉?

public class LoginScreen extends ActionBarActivity { 
    private final String ARG_SELECTED_LAYOUT_ID = "selectedLayoutId"; 
private final int DEFAULT_LAYOUT = R.layout.layout_list; 

private int mSelectedLayoutId; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayShowHomeEnabled(false); 

    mSelectedLayoutId = DEFAULT_LAYOUT; 
    if (savedInstanceState != null) { 
     mSelectedLayoutId = savedInstanceState.getInt(ARG_SELECTED_LAYOUT_ID); 
    } 

    addLayoutTab(
      actionBar, R.layout.layout_list, R.drawable.ic_list, "list"); 
    addLayoutTab(
      actionBar, R.layout.layout_grid, R.drawable.ic_grid, "grid"); 
    addLayoutTab(
      actionBar, R.layout.layout_staggered_grid, R.drawable.ic_staggered, "staggered"); 
    addLayoutTab(
      actionBar, R.layout.layout_spannable_grid, R.drawable.ic_spannable, "spannable"); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt(ARG_SELECTED_LAYOUT_ID, mSelectedLayoutId); 
} 

private void addLayoutTab(ActionBar actionBar, int layoutId, int iconId, String tag) { 
    ActionBar.Tab tab = actionBar.newTab() 
      .setText("") 
      .setIcon(iconId) 
      .setTabListener(new TabListener(layoutId, tag)); 
    actionBar.addTab(tab, layoutId == mSelectedLayoutId); 
} 

public class TabListener implements ActionBar.TabListener { 
    private LayoutFragment mFragment; 
    private final int mLayoutId; 
    private final String mTag; 


    public TabListener(int layoutId, String tag) { 
     mLayoutId = layoutId; 
     mTag = tag; 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag); 



     if (mFragment == null) { 
      mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId); 
      ft.add(R.id.content, mFragment, mTag); 

     } else { 
      ft.attach(mFragment); 
     } 


     /* 
      Bundle bundle = new Bundle(); 
      bundle.putInt("noTiles", 4); 
      mFragment.setArguments(bundle);   
     */ 

     mSelectedLayoutId = mFragment.getLayoutId(); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { 
    } 
} 

}

logcat的

03-03 11:56:53.675 32507-32507/weebuns.predictionking E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: weebuns.predictionking, PID: 32507 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      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:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference 
+1

您使用未註釋的代碼獲得的logcat錯誤是什麼? – 2015-03-03 10:35:15

+0

添加logcat :) – Fearghal 2015-03-03 11:04:19

+0

當您創建實例時發送包:mFragment =(LayoutFragment)LayoutFragment.newInstance(mLayoutId,YourBundle); – 2015-03-03 11:11:48

回答

1

很難沒有看到logcat的說,但肯定你缺少呼籲FragmentTransactioncommit()方法。還請記得在調用ft.commit()之前將參數設置爲片段。

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag); 

    if (mFragment == null) { 
     Bundle bundle = new Bundle(); 
     bundle.putInt("noTiles", 4); 
     mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId); 
     mFragment.setArguments(bundle); 
     //ft.add(R.id.content, mFragment, mTag).commit(); 
     ft.add(R.id.content, mFragment, mTag); 

    } else { 
     ft.attach(mFragment); 
    } 

    mSelectedLayoutId = mFragment.getLayoutId(); 
} 
+0

Thx a mill。你能發送你認爲我應該有的代碼 - 你的代碼去哪裏了? – Fearghal 2015-03-03 10:56:44

+0

添加logcat :) – Fearghal 2015-03-03 11:05:14

+0

即時通訊錯誤:導致:java.lang.NullPointerException:試圖調用虛擬方法'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)'對空引用 – Fearghal 2015-03-03 11:49:31

3

從活動發送數據意圖如下:

Bundle bundle = new Bundle(); 
    bundle.putString("edttext", "From Activity"); 
    // set Fragmentclass Arguments 
    Fragmentclass fragobj = new Fragmentclass(); 
    fragobj.setArguments(bundle); 
    ft.add(R.id.content, fragobj, mTag); 

和片段onCreateView方法:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    String strtext = getArguments().getString("edttext");  
    return inflater.inflate(R.layout.fragment, container, false); 
} 
+0

Thx,但我有那裏的代碼和它打破了它,這個代碼應該去哪裏?我的包代碼是否正確?查看我發佈的代碼,查看註釋掉的問題代碼。 – Fearghal 2015-03-03 10:55:43

+0

已添加logcat :) – Fearghal 2015-03-03 11:04:30

+0

檢查更新的答案 – Fahim 2015-03-03 11:09:09

1

在您的活動

Bundle args = new Bundle(); 
args.putString("Menu", "Your String"); 
Fragment detail = new FragmeantOne(); 
detail.setArguments(args); 
FragmentManager fragmentManager = getFragmentManager(); 
fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit(); 

在您的片段..在onCreateView()

String menu = getArguments().getString("Menu"); 
someTextView.setText(menu); 
+0

Thx,但我有那裏的代碼,它打破了它,這個代碼應該去哪裏?我的包代碼是否正確?查看我發佈的代碼,查看註釋掉的問題代碼。 – Fearghal 2015-03-03 10:55:54

+0

新增logcat :) – Fearghal 2015-03-03 11:04:36

1

可以使用捆綁將數據從活動從片段轉移到片段或transfre數據到分段。

Bundle bundle = new Bundle(); 
DisplayDataList fragment = new DisplayDataList(); 
bundle.putString("listitem", "Buyer,Seller"); 
      fragment.setArguments(bundle); 

      getFragmentManager().beginTransaction().replace(
        R.id.frame_container, fragment).addToBackStack(null).commit(); 

你想要在DisplayDataList片段類中獲得那個包i.w的地方。您必須使用方法。

DisplayDataList

Bundle bundle = getArguments(); 
      String getdata = bundle.getString("listitem"); 
      System.out.println("Data got-->>> " + getdata); 

希望這會幫助你。

+0

Thx,但我有那個代碼(或嘗試它)在那裏,它打破了它,這個代碼應該去哪裏?我的包代碼是否正確?查看我發佈的代碼,查看註釋掉的問題代碼。你可以把你的代碼放在我的類名等的上下文中,這樣我就可以更好地看到它在哪裏,因爲我的應該至少不會崩潰應用程序。 – Fearghal 2015-03-03 10:58:53

+0

在替換或添加新片段之前使用Bundle代碼,並確保您傳遞的片段對象包中替換code.Try這個LayoutFragment mFragment = new LayoutFragment(); Bundle bundle = new Bundle(); bundle.putInt(「noTiles」,4); mFragment.setArguments(bundle); \t \t \t \t \t \t如果(mFragment == NULL){ mFragment =(LayoutFragment)LayoutFragment.newInstance(mLayoutId); ft.add(R.id.content,mFragment,mTag);其他{ } } – 2015-03-03 11:05:35

+0

我得到以下錯誤:引起:java.lang.NullPointerException:嘗試調用null對象引用上的虛擬方法'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' – Fearghal 2015-03-03 11:57:17

2

要傳遞參數給您的片段,它是建議創建一個公共靜態方法來實例化您的片段,如:

public static MyFragment newInstance(String firstArg) { 
     MyFragment f = new MyFragment(); 
     Bundle args = new Bundle(); 
     args.putString("ARG1", firstArg); 
     f.setArguments(args); 
     return f; 
    } 

,然後檢索您的ARGS在onCreateView()方法,如:

String arg = getArguments().getString("ARG1"); 

使用在其他片段或活動中使用您的參數實例化新片段的靜態方法:

MyFragment f = MyFragment.newInstance(myArg); 
相關問題