我如何保存线性布局及其所有内部视图并在以后使用 android

How I can save a linear layout and all its inner views and use it later android

我有 一个 activity 并且在其中我有一个线性布局(我们将其命名为 "main linear layout")并且我在其中添加了动态创建的视图它(文本视图、线性布局、编辑文本等)。

在屏幕底部有两个按钮(下一步和返回)。

如果用户单击下一步按钮,我应该将当前 "main linear layout " 保存在一个列表中,然后生成一个新视图并将其添加到 "main linear layout" 中,然后 .

如果用户点击后退按钮,我应该恢复 "main linear layout" 并显示其所有视图。

我不知道怎么办。

希望我的描述清楚:)

查看 onSaveInstance 以在离开不同的 activity 或屏幕方向时保留主屏幕上的视图。

您也可以尝试使用按钮通过可见性隐藏布局,而不是尝试在它们之间导航。

这可能对您有所帮助。但是具体的代码需要你自己写。

public class TestActivity extends Activity{
    Stack<LinearLayout> layouts  = new Stack<>();
    FrameLayout container;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button btnPre = new Button(this);
        Button btnNext = new Button(this);
        btnPre.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                container.addView(layouts.pop());
            }
        });
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LinearLayout linearLayout = (LinearLayout) container.getChildAt(0);
                layouts.push(linearLayout);
                container.removeAllViews();
                container.addView(createNextView());
            }
        });
    }
    private LinearLayout createNextView(){
        LinearLayout linearLayout = new LinearLayout(this);
        return linearLayout;
    }
}

谢谢大家的评论。

我还没有测试 Cyrus 的答案。我也会 post 我的答案,以防有人在 Xamarin.Android 中遇到同样的问题,因为我正在使用它。

我是这样修复的:

我在下一个按钮点击事件和上一个按钮点击事件中添加了这个:

AddQuestionsLinearLayoutToPagesLinearLayoutsList();

而 AddQuestionsLinearLayoutToPagesLinearLayoutsList() 主体是,当然您可以按照自己的方式更改它:

private void AddQuestionsLinearLayoutToPagesLinearLayoutsList()
    {
         //Create a new linear layout to add views into it and saved it in _mPagesLinearLayouts list at index _mPageIndex
         LinearLayout savedLinearLayout = new LinearLayout(this);

         //List of _mQuestionsLinearLayout views
         List<View> views = new List<View>();

         //Add all _mQuestionsLinearLayout to views list
         for (int i = 0; i < _mQuestionsLinearLayout.ChildCount; i++)
         {
             views.Add(_mQuestionsLinearLayout.GetChildAt(i));
         }

         //Remove views from main questions linear layout
         _mQuestionsLinearLayout.RemoveAllViews();

         //Add all views from the views list to savedLinearLayout
         for (int i = 0; i < views.Count; i++)
         {
             savedLinearLayout.AddView(views[i]);
         }

         //Add savedLinearLayout to _mPagesLinearLayouts list at index _mPageIndex
         _mPagesLinearLayouts.Insert(_mPageIndex, savedLinearLayout);
    }

在创建视图方法中:

    if(NeedToCreateViews())
    {
//create views here and add it to _mQuestionsLinearLayout
}
//Get all saved views and add it to _mQuestionsLinearLayout
else
            {
                //List of _mPagesLinearLayouts[_mPageIndex] LinearLayout views
                List<View> views = new List<View>();

                //Add all _mPagesLinearLayouts[_mPageIndex] LinearLayout to views list
                for (int i = 0; i < _mPagesLinearLayouts[_mPageIndex].ChildCount; i++)
                {
                    views.Add(_mPagesLinearLayouts[_mPageIndex].GetChildAt(i));             
                }

                //Remove all views from  _mPagesLinearLayouts[_mPageIndex] linear layout
                _mPagesLinearLayouts[_mPageIndex].RemoveAllViews();

                //Remove the linear layout at index _mPageIndex
                _mPagesLinearLayouts.RemoveAt(_mPageIndex);

                //Add all views from views list to _mQuestionsLinearLayout
                for (int i = 0; i < views.Count; i++)
                {
                    _mQuestionsLinearLayout.AddView(views[i]);
                }

            }