我如何保存线性布局及其所有内部视图并在以后使用 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]);
}
}
我有 一个 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]);
}
}