Android - ListFragment,空包,
Android - ListFragment, empty bundle,
我试图将参数传递给我的片段 in the way described here. 但是我有一个问题,我每次都得到空包 (null)。 Fragment 首先在 setContentView 中连接,然后使用 newInstance 替换它(那里一切正常,bundle 在 fragment 中创建、添加和返回)。在这两种情况下,在 onCreate 中我都得到空包。在开始创建时它应该是空的,但在用 newInstance 中添加的包替换片段后它不应该。
有什么想法吗?
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);
}
菜单活动
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();
}
菜单活动布局
<?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>
bd1
和 getArguments()
不是一回事。 bd1
实际上是 savedInstanceState
。
如果您检查 bd1 != null
那么在您第一次启动 Fragment 时当然没有保存的实例状态。例如,如果设备方向发生变化,那将不为空。
另一方面,getArguments()
仅在第一次启动时设置,当您在构造函数中设置的参数被传递时。
只需删除 if (bd1 != null)
即可。
我试图将参数传递给我的片段 in the way described here. 但是我有一个问题,我每次都得到空包 (null)。 Fragment 首先在 setContentView 中连接,然后使用 newInstance 替换它(那里一切正常,bundle 在 fragment 中创建、添加和返回)。在这两种情况下,在 onCreate 中我都得到空包。在开始创建时它应该是空的,但在用 newInstance 中添加的包替换片段后它不应该。
有什么想法吗?
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);
}
菜单活动
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();
}
菜单活动布局
<?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>
bd1
和 getArguments()
不是一回事。 bd1
实际上是 savedInstanceState
。
如果您检查 bd1 != null
那么在您第一次启动 Fragment 时当然没有保存的实例状态。例如,如果设备方向发生变化,那将不为空。
另一方面,getArguments()
仅在第一次启动时设置,当您在构造函数中设置的参数被传递时。
只需删除 if (bd1 != null)
即可。