【问题标题】:How does one pass arguments to a fragment?如何将参数传递给片段?
【发布时间】:2018-07-17 15:48:53
【问题描述】:

好的,所以我在活动中有一个片段。我正在尝试将启动活动的意图中的 int 传递给该片段,但由于某种原因,我从片段的参数中得到了 0。我做错了什么?

这是负责传递 int 的代码:

public void initActivity() {
    toolbar = findViewById(R.id.toolbar);

    resName = getIntent().getExtras().getString("Name");
    int ResID = getIntent().getExtras().getInt("ResID");
    Log.d("SplitBill","From initActivity(): We have received ResID as " + ResID);

    Bundle bundle = new Bundle();
    bundle.putInt("ResID", ResID);
    Log.d("SplitBill",bundle.getInt("ResID") + " has been put into the bundle.");

    PlaceholderFragment pf = new PlaceholderFragment();
    pf.setArguments(bundle);

    toolbar.setTitle(resName);
}

这是负责接收 int 的代码:

Activity activity = getActivity();
Bundle args = getArguments();
MenuViewModel viewModel = ViewModelProviders.of(this, new MenuViewModelFactory(activity.getApplication(), args.getInt(“ResID”))).get(MenuViewModel.class);

如果我在上面的 args.getInt() 中手动输入一个数字,代码就可以正常工作,我只是在努力从上面设置的参数中获取 int。

抱歉,格式错误,我是在手机上输入的。

MenuActivity 中的 ResID 声明:private int ResID;

【问题讨论】:

  • 你在哪里调用你的receiving int代码?
  • 在片段的onCreateView()方法中
  • 你能仔细检查一下ResIDinitActivity()中是否不为零
  • 我刚刚添加了将 ResID 打印到 logcat 的代码,并且可以确认它永远不会返回零
  • 再一次,你从未使用过这个片段,你只需要创建新实例并设置参数,而已经使用的实例(通过布局)没有参数

标签: android android-fragments viewmodel


【解决方案1】:

Sender:@Override onCreate() 中的 Activity 类。

Receiver:@Override onCreateView() 中的 Fragment 类。

Android lifecycle diagram for Activity and Fragment.

Android documentation for Bundle.

public class MyApplication extends AppCompatActivity {
 @Override onCreate(...){
  Bundle bundle = new Bundle();
  bundle.putInteger("myint", YOUR_INT_GOES_HERE);
  this.setArguments(bundle);

  //see your int and make sure it's inside the bundle.
  Log.d("onCreate()", "my sender : " + YOUR_INT_GOES_HERE 
  + " what i'm sending: " + bundle.getString("myint") );
 }
}
public class MyFragmentExtension extends Fragment {
 @Override onCreateView(...){
  int receiver = getArguments().getString("myint");
  Log.d("onCreateView()", "my receiver: " + receiver);
 }
}

【讨论】:

  • 好的,所以我已经将发送方代码移至 onCreate(),而接收方代码始终在 onCreateView() 中。 ResID 仍在片段内作为 0 传递
  • 它被初始化为什么?你能更新你初始化 ResId 的代码吗?也许你也可以更新非零的代码。
  • 我已经更新了 ResID 的声明。它是从另一个活动的 RecyclerViewAdapter 接收的,其中视图都有从数据库中检索到的标识符,这些标识符都不是 0。(我自己使用手机上的 sqlite3 二进制文件检查了数据库,标识符从 1 开始)跨度>
  • 我试过你的添加。 onCreate() 代码有效,但仍将 0 传递给 Fragment。
  • 我对某事很好奇,更改 int resId = 12345;通过并测试它。
【解决方案2】:

修好了!由于在 Bundle 中向下传递 int 根本不起作用(请参阅 @EvOlaNdLuPiZ 答案和评论线程),我在类的顶部将其声明为 public static int,并使用 MenuActivity.ResID 在片段的 onCreateView() 方法。感谢您的所有帮助!

【讨论】:

  • 这在进程死亡中不起作用:stackoverflow.com/questions/49046773/…
  • 我知道不会。除了通过调用它的 Activity 之外,无法以任何其他方式打开此 Activity(除非您使用 am,否则应用程序将崩溃),并且无法导航回,这就是我采用这种方法的原因。
  • 每个活动都可以由系统启动,您的ResID 将被初始化为0,您很可能会崩溃。好吧,除非你的 Fragment 只在 MenuActivity 中使用过,它会巧合地工作。根据您的代码,问题是 pf 从未真正添加到 FragmentManager,因此您可能在其他地方添加了片段没有参数。
  • 另外@EpicPandaForce 我说过这个活动不能以任何其他方式打开,因为它必须从主活动启动,这会将信息向下传递。如果此信息不存在,应用程序将崩溃并显示java.lang.NullPointerException。只是想我会澄清一下。
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多