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

Android 如何保存线性布局及其所有内部视图并在以后使用,android,android-layout,layout,views,android-linearlayout,Android,Android Layout,Layout,Views,Android Linearlayout,我有一个活动,里面有一个线性布局(我们称之为“主线性布局”),我在里面添加了动态创建的视图(文本视图、线性布局、编辑文本等等) 在屏幕底部有两个按钮(下一步和后退) 如果用户单击“下一步”按钮,我应该将当前的“主要线性布局”保存在列表中,例如,然后我生成一个新视图,并将其添加到“主要线性布局”中 如果用户点击后退按钮,我应该恢复“主线性布局”并显示其所有视图 我不知道该怎么做 我希望我的描述是清楚的:)看看onSaveInstance,它可以在转到其他活动或屏幕方向时保留主屏幕上的视图 您也可以

我有一个活动,里面有一个线性布局(我们称之为“主线性布局”),我在里面添加了动态创建的视图(文本视图、线性布局、编辑文本等等)

在屏幕底部有两个按钮(下一步和后退)

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

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

我不知道该怎么做


我希望我的描述是清楚的:)

看看onSaveInstance,它可以在转到其他活动或屏幕方向时保留主屏幕上的视图


您也可以尝试使用按钮,使用可见性隐藏布局,而不是尝试在布局中导航。

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

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;
    }
}
公共类测试活动扩展活动{
堆栈布局=新堆栈();
框架布局容器;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
按钮btnPre=新按钮(此按钮);
按钮btnNext=新按钮(此按钮);
btnPre.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
container.addView(layouts.pop());
}
});
btnNext.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
LinearLayout LinearLayout=(LinearLayout)容器。getChildAt(0);
布局。推送(线性布局);
container.removeallview();
addView(createNextView());
}
});
}
private LinearLayout createNextView(){
LinearLayout LinearLayout=新的LinearLayout(本);
返回线性布局;
}
}

谢谢大家的评论

我还没有测试赛勒斯的答案。如果有人在我使用Xamarin.Android时遇到同样的问题,我也会发布我的答案

我是这样修复的:

我在“下一个按钮单击事件”和“上一个按钮单击事件”中添加了此项:

AddQuestionsLinearLayoutToPagesLinearLayoutsList();
addQuestionsLinearLayoutOpagesLinearLayoutList()的主体是,当然,您可以按照自己的方式进行更改:

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);
    }
private void addquestionslinearlayouttopageslinearlayoutlist()
{
//创建一个新的线性布局,向其中添加视图,并将其保存在索引处的“线性布局”列表中
LinearLayout savedLinearLayout=新的LinearLayout(此);
//_mQuestionsLinearLayout视图列表
列表视图=新列表();
//将所有_mQuestionsLinearLayout添加到视图列表
对于(int i=0;i<\u mQuestionsLinearLayout.ChildCount;i++)
{
添加(_mQuestionsLinearLayout.GetChildAt(i));
}
//从主要问题线性布局中删除视图
_mQuestionsLinearLayout.RemoveAllViews();
//将“视图”列表中的所有视图添加到savedLinearLayout
对于(int i=0;i
在创建视图方法中:

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

            }
if(需要创建视图())
{
//在此处创建视图并将其添加到_mQuestionsLinearLayout
}
//获取所有保存的视图并将其添加到_mQuestionsLinearLayout
其他的
{
//_mpagelinearlayouts[\u mPageIndex]LinearLayout视图列表
列表视图=新列表();
//将所有_mpagelinearlayout[\u mPageIndex]LinearLayout添加到视图列表
对于(int i=0;i<\mpagelinearlayouts[\mPageIndex]。ChildCount;i++)
{
添加(_mpagelinearlayouts[_mPageIndex].GetChildAt(i));
}
//从_mpagelinearlayouts[\u mPageIndex]线性布局中删除所有视图
_MPageLinearLayouts[\u mPageIndex]。移除所有视图();
//删除索引处的线性布局
_mpagelinearlayouts.RemoveAt(\u mPageIndex);
//将视图列表中的所有视图添加到_mQuestionsLinearLayout
对于(int i=0;i
我已经编辑了我的问题,我有一个活动,我正在重复使用相同的线性布局。onSaveInstance在这种情况下可以帮助我吗?只有在活动(存储数据的活动)由于配置更改或内存不足而被销毁时,才会在onSaveInstanceState中保存数据并在RestoreInstanceState中检索该数据。这就是您所需要的吗?我想您可能希望使用FragmentTransaction查看片段,以添加(下一个)或弹出(返回)到原始视图。看看这个答案: