我正在开发一个需要从用户那里检索一些信息的应用程序,我正在使用Fragments来做到这一点。我们的想法是让ListFragment显示允许用户提供信息的不同片段的名称,当用户单击ListFragment中的一个名称时,如果我们处于纵向模式或下一个ListFragment,相应的片段将全屏显示在横向模式。
作为基础,我使用了以下链接中解释和给出的代码: google fragment和Dynamic Layouts using the Fragment Manager。
我“稍微”修改了上面链接的代码,在Fragment中有两个用于检索信息的TextView。我试图保留这个片段的状态。我尝试将 setRetainInstance 设置为true,但它不起作用,所以我尝试使用 onSaveInstanceState 。
在 onSaveInstanceState 中,我将TextView的内容放在一个包中,如果savedInstanceState不为null,则将其放在 onCreateView 中,然后检索要在TextView中显示的字符串。我可以在调试模式中看到一切(似乎)都有效,在onSaveInstanceState之后Bundle有字符串,在onCreateView中,字符串被正确检索并使用setView传递给TextView,但最后TextView保持为空。
为什么会这样?怎么会发生这种情况?
在我的片段代码下面:
public class DataFragment extends AbstractFragment {
private final String TAG = getClass().getSimpleName();
private View mView;
private TextView mFirstNameTextView = null;
private TextView mMailTextView = null;
Bundle mArgs;
public DataFragment(){
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
mView = inflater.inflate(R.layout.data_fragment, container, false);
mFirstNameTextView = (TextView)mView.findViewById(R.id.setting_Firstname);
mMailTextView = (TextView)mView.findViewById(R.id.setting_Mail);
if (savedInstanceState!=null){
String test = savedInstanceState.getString("name");
String retest = savedInstanceState.getString("mail");
mFirstNameTextView.setText(test);
mMailTextView.setText(retest);
}
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String test = mFirstNameTextView.getText().toString();
String testmail = mMailTextView.getText().toString();
outState.putString("name", mFirstNameTextView.getText().toString());
outState.putString("mail", mMailTextView.getText().toString());
}
@Override
public void onPause() {
super.onPause();
}
@Override
public int getShownIndex() {
int ret = getArguments().getInt("index", 0);
return ret;
}
}
要完成此Fragment继承自AbstractFragment。 AbstractFragment如其名称所述,是一个从Fragment继承的抽象类。我使用这个类是因为我计划有几个片段,这个类可以帮助我编写更少的代码。完整性如下是AbstractFragment的代码:
public abstract class AbstractFragment extends Fragment {
public AbstractFragment(){}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setRetainInstance(true);
}
public int getShownIndex(){
int ret = getArguments().getInt("index", 0);
return ret;
}
}
修改
需要明确的是,问题不在于检索数据,问题在于显示数据。我正在使用 onSaveInstanceState 检索我存储的值,但这些值不会显示在TextView中。在我的应用程序的屏幕截图下面,在onSaveInstanceState上有一个断点,这个截图是在我在TextView中输入字符串“foo”和“bar”之后拍摄的,然后我旋转在AVD中,我们可以在屏幕截图中看到字符串“foo”和“bar”位于savedInstanceState Bundle中,变量test和retest被正确初始化为 “foo”和“bar”,但这些字符串不会显示在TextView中