Android - 尽管(显然)使用setView,文本仍然没有显示在TextView中

时间:2015-10-09 16:41:22

标签: android android-fragments textview

我正在开发一个需要从用户那里检索一些信息的应用程序,我正在使用Fragments来做到这一点。我们的想法是让ListFragment显示允许用户提供信息的不同片段的名称,当用户单击ListFragment中的一个名称时,如果我们处于纵向模式或下一个ListFragment,相应的片段将全屏显示在横向模式。

作为基础,我使用了以下链接中解释和给出的代码: google fragmentDynamic 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中 enter image description here

0 个答案:

没有答案