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查看片段,以添加(下一个)或弹出(返回)到原始视图。看看这个答案: