首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Fragment getArguments() 回傳 null?Activity 傳值給 Fragment 正確姿勢

     編輯:程式設計綜合問答

問題核心

Activity 透過 Intent 傳值給另一個 Activity,該 Activity 再將資料塞給內部 Fragment。若直接在 Fragment 呼叫 getArguments() 卻拿到 null,通常是因為未正確建立並設定 Bundle 給 Fragment。

正確傳值流程

步驟 1:發送端 Activity 建立 Intent 並附加資料

// Activity1
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("key_user_id", 12345);
intent.putExtra("key_token", "abcde");
startActivity(intent);

步驟 2:接收端 Activity 取出資料並包裝成 Bundle

// Activity2.onCreate()
Bundle bundle = new Bundle();
bundle.putInt("user_id", getIntent().getIntExtra("key_user_id", -1));
bundle.putString("token", getIntent().getStringExtra("key_token"));

// 關鍵:建立 Fragment 實例並 setArguments
MyFragment fragment = new MyFragment();
fragment.setArguments(bundle);

// 加入 ViewPager 或 FragmentTransaction
getSupportFragmentManager().beginTransaction()
    .replace(R.id.container, fragment)
    .commit();

步驟 3:Fragment 內安全取值

// MyFragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // getArguments() 此時已非 null
    Bundle args = getArguments();
    if (args != null) {
        int userId = args.getInt("user_id", -1);
        String token = args.getString("token", "");
        // 後續邏輯...
    }
}

常見錯誤與修正

錯誤寫法後果修正方式
在 Fragment 建構子呼叫 setArguments()Fragment 可能被系統重建導致參數遺失務必在 onCreate() 前由宿主 Activity 設定
直接 new MyFragment() 後未 setArgumentsgetArguments() 回傳 null建立實例後立即呼叫 setArguments(bundle)
使用 putExtra 直接塞給 FragmentFragment 無法直接讀取 Activity Intent必須轉為 Bundle 經由 setArguments

ViewPager 搭配 FragmentPagerAdapter 範例

public class MyPagerAdapter extends FragmentPagerAdapter {
    private final Bundle args;

    public MyPagerAdapter(FragmentManager fm, Bundle args) {
        super(fm);
        this.args = args;
    }

    @Override
    public Fragment getItem(int position) {
        MyFragment f = new MyFragment();
        f.setArguments(args); // 每個分頁共用同一份參數
        return f;
    }
    // ...
}

最佳實務: 定義 newInstance(Bundle args) 靜態工廠方法封裝建立邏輯,避免散落在各處。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved