我试图将参数传递给我的片段in the way described here.但是我有一个问题,每次都得到空的bundle(null)。 Fragment首先在setContentView中连接,然后使用newInstance替换它(一切正常,bundle创建,添加并以片段形式返回)。在onCreate的两种情况下,我都得到空包。在开头创建时它应该是空的,但是在newInstance中用添加的bundle替换片段之后它不应该是。
有什么想法吗?
ListFragment
public class LeftListFragment extends ListFragment {
private FragmentConnector connector;
private FragmentConnector.listType type;
public static final LeftListFragment newInstance(ArrayList<String> values) {
LeftListFragment llf = new LeftListFragment();
final Bundle bdl = new Bundle(1);
bdl.putStringArrayList("values", values);
llf.setArguments(bdl);
return llf;
}
public void onCreate(Bundle bd1) {
super.onCreate(bd1);
if (bd1 != null) {
List<String> tempList = getArguments().getStringArrayList("values");
//due to JVM optimizations, using new String[0] is better than new String[list.size()]
String[] values = tempList.toArray(new String[0]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.rowlayout, R.id.label, values);
setListAdapter(adapter);
}
MenuActivity
public class MenuActivity extends Activity implements FragmentConnector {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
setContentView(R.layout.activity_menu);
if(savedInstanceState == null){
getFragmentManager()
.beginTransaction()
.replace(R.id.leftListFragment ,LeftListFragment.newInstance(list))
.addToBackStack(null)
.commit();
}
MenuActivity Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:baselineAligned="false"
android:orientation="horizontal"
tools:context=".Menu.MenuActivity"
android:layout_height="300dp"
android:layout_width="fill_parent">
<fragment
android:id="@+id/leftListFragment"
class="com.buczel.attapp.Menu.LeftListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
tools:layout="@layout/rowlayout">
</fragment>
答案 0 :(得分:1)
bd1
和getArguments()
不是同一回事。 bd1
实际上是savedInstanceState
。
如果您检查bd1 != null
,那么当然第一次启动片段时没有保存的实例状态。例如,如果设备方向发生变化,则该值不为空。
另一方面,getArguments()
仅在您在构造函数中设置的参数传递时才在第一次启动时设置。
只需删除if (bd1 != null)
,您就应该好了。