我试图将一些变量从一个活动传递给一个片段,然后再传回一个活动。在片段的onCreate
内,getArguments()
不为空,我能够获取变量。但是,在片段的onClick
内(触发返回活动),getArguments()
和onCreate
中检索到的变量为空。
在我的活动中:
public void goToFragment() {
MyFragment myFragment = new MyFragment();
// create new bundle and put extras
Bundle myExtras = new Bundle();
myExtras.putString("firstName", firstName);
myExtras.putString("lastName", lastName);
myExtras.putString("favoriteColor", favoriteColor);
myFragment.setArguments(myExtras);
// start the fragment
getFragmentManager().beginTransaction()
.replace(R.id.container, myFragment.newInstance())
.add(myFragment, myExtras.toString())
.commit();
}
我的片段:
public class MyFragment extends Fragment implements View.OnClickListener {
private String firstName;
private String lastName;
private String favoriteColor;
private Button myButton;
...
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
firstName = MyFragment.this.getArguments().getString("firstName");
lastName = MyFragment.this.getArguments().getString("lastName");
favoriteColor = MyFragment.this.getArguments().getString("favoriteColor");
Log.d(TAG, "Extras from activity page: firstName = " + firstName + ", lastName = " + lastName + ", favoriteColor = " + favoriteColor);
} else {
Log.v(TAG, "getArguments() != null");
}
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
myButton = (Button) view.findViewById(R.id.myButton);
myButton.setOnClickListener(this);
}
...
@Override
public void onClick(View view) {
Log.d(TAG, "onClick: triggered...");
// **ISSUE:** my variables are null here even though they were set in the `onCreate`
Log.d(TAG, "onClick: firstName = " + firstName);
Log.d(TAG, "onClick: lastName = " + lastName);
Log.d(TAG, "onClick: favoriteColor = " + favoriteColor);
// Alternative attempt: get extras
//if (MyFragment.this.getArguments() != null) {
// firstName = getArguments().getString("firstName");
// lastName = getArguments().getString("lastName");
// favoriteColor = getArguments().getString("favoriteColor");
// Log.d(TAG, "Extras getArguments(): firstName = " + firstName + ", lastName = " + lastName + ", favoriteColor = " + favoriteColor);
//} else {
// Log.d(TAG, "getArguments() != null");
//}
// initiate intent
Intent intent = new Intent(getActivity(), MyActivity.class);
intent.putExtra("firstName", firstName);
intent.putExtra("lastName", lastName);
intent.putExtra("favoriteColor", favoriteColor);
startActivity(intent);
break;
}
}
替代尝试:
firstName
MyFragment.this.firstName
更改为onClick
onClick
内无法访问片段的变量,我还尝试从onCreate
获取代码并将其放在onClick
内(所以单击按钮时设置变量,但getArguments()
内MyFragment.this.getArguments()
(和onClick
)为空 是否有人理解为什么我的变量在片段onClick
但不是onCreate
内是空的(以及如何防止此问题)?
答案 0 :(得分:2)
试试这个
getFragmentManager().beginTransaction()
.replace(R.id.container, myFragment)
.commit();
而不是
getFragmentManager().beginTransaction()
.replace(R.id.container, myFragment.newInstance())
.add(myFragment, myExtras.toString())
.commit();
答案 1 :(得分:0)
当应用程序尝试使用时抛出NullPointerException 具有空值的对象引用。
更新 replace
方法。删除 .add
方法。
.replace(R.id.container, _fragmentOBJ)
<强>结构强>
FragmentTransaction replace(int containerViewId, 片段片段)
然后
Bundle bundle = getArguments();
firstName = bundle.getString("firstName","");
答案 2 :(得分:0)
我可以在发布的代码中看到两个问题。
add()
和replace()
。根据您的要求选择任何一种。您已使用Fragment
关键字
new
的实例
MyFragment myFragment = new MyFragment();
并设置参数。
但在myFragment.newInstance()
中调用replace()
。希望(作为代码未共享)newInstance()
正在创建Fragment
的另一个实例,并且没有为该实例设置参数。这可能会导致片段中出现空参数。