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

时间:2017-05-03 12:39:09

标签: android android-layout layout views android-linearlayout

我有一个活动,在里面我有一个线性布局(让我们把它命名为“主线性布局”),我在其中添加动态创建的视图(文本视图,线性布局,编辑文本,...等)。

屏幕底部有两个按钮(下一个和后一个)。

如果用户单击下一个按钮,我应该将当前的“主线性布局”保存在列表中,然后我生成一个新视图,然后将其添加到“主线性布局”中。

如果用户点击后退按钮,我应该恢复“主线性布局”并显示其所有视图。

我不知道怎么做。

我希望我的描述清楚:)

3 个答案:

答案 0 :(得分:0)

在离开其他活动或屏幕方向时,请查看onSaveInstance以保留主屏幕上的视图。

您还可以尝试使用按钮隐藏布局,而不是尝试浏览布局。

答案 1 :(得分:0)

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

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;
    }
}

答案 2 :(得分:0)

谢谢大家的意见。

我没有测试Cyrus的答案。我会发布我的答案,以防有人在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]);
                }

            }