Android 保存完整的片段和视图状态
我有很多文本视图的片段。我把这个片段的4个放在ViewPager选项卡中。我搜索了很多关于保存片段状态的内容,但都说要保存单个元素的数据,然后恢复它们的数据并重新分配TextView值。但我需要保存完整的片段状态及其视图元素值,并完全恢复它,因为重新分配TextViews值非常耗时。 有人能告诉我如何保存完整的片段状态并在不需要重新赋值的情况下恢复它吗 谢谢 这是我想要完全存储的片段类:Android 保存完整的片段和视图状态,android,android-layout,android-fragments,android-fragmentactivity,savestate,Android,Android Layout,Android Fragments,Android Fragmentactivity,Savestate,我有很多文本视图的片段。我把这个片段的4个放在ViewPager选项卡中。我搜索了很多关于保存片段状态的内容,但都说要保存单个元素的数据,然后恢复它们的数据并重新分配TextView值。但我需要保存完整的片段状态及其视图元素值,并完全恢复它,因为重新分配TextViews值非常耗时。 有人能告诉我如何保存完整的片段状态并在不需要重新赋值的情况下恢复它吗 谢谢 这是我想要完全存储的片段类: public class SampleFragment extends Fragment{ private
public class SampleFragment extends Fragment{
private TextView[] month_days;
private TextView[] weeks;
private TextView[] week_days;
private TableRow[] tb_row;
private TextView month_name;
protected boolean MONTH_NAME_VISIBILITY = false;
protected boolean WEEK_NUMBER_VISIBILITY = false;
private Configurations conf = new Configurations();
private View rootView;
@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.month_view, container, false);
initialize(this.getActivity());
setDate();
return rootView;
}
private void initialize(Context context) {
month_days = new TextView[42];
weeks = new TextView[6];
week_days = new TextView[7];
tb_row = new TableRow[7];
month_name = (TextView) rootView.findViewById(R.id.month_name);
Integer i, j, id;
for (i = 0; i < 42; i++) {
id = rootView.getResources().getIdentifier("tv" + (i + 1) + "", "id",conf.getPACKAGE_NAME() );
month_days[i] = (TextView) rootView.findViewById(id);
}
for (i = 0; i < 6; i++) {
id = rootView.getResources().getIdentifier("tvw" + (i + 1) + "", "id", conf.getPACKAGE_NAME());
weeks[i] = (TextView) rootView.findViewById(id);
weeks[i].setTextAppearance(activity, R.style.SmallFontBold);
}
for (i = 0; i < 7; i++) {
id = rootView.getResources().getIdentifier("tvwd" + (i + 1) + "", "id", conf.getPACKAGE_NAME());
week_days[i] = (TextView) rootView.findViewById(id);
week_days[i].setText(conf.getDayName()[i]);
week_days[i].setTextAppearance(activity, R.style.SmallFontBold);
if (Arrays.asList(conf.getWEEK_FREE_DAYS_INDEX()).contains(String.valueOf(i)))
week_days[i].setTextColor(Color.RED);
id = getResources().getIdentifier("row" + (i + 1) + "", "id", conf.getPACKAGE_NAME());
tb_row[i] = (TableRow) rootView.findViewById(id);
}
}
public void setDate() {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(conf.getCurrentCal().getFirstDayOfWeek());
Integer i, j = 0, wn, backday, z;
cal.set(conf.getCurrentCal().get(YEAR), conf.getCurrentCal().get(MONTH), 1);
backday = ((cal.get(DAY_OF_WEEK)) - cal.getFirstDayOfWeek() + 7) % 7;
wn = (int) (Math.ceil((backday + cal.getActualMaximum(DAY_OF_MONTH)) / 7.0));
cal.add(DAY_OF_WEEK, -backday);
for (i = 0; i < wn * 7; i++) {
month_days[i].setText(String.valueOf(cal.get(DAY_OF_MONTH)));
if (Arrays.asList(conf.getWEEK_FREE_DAYS_INDEX()).contains(String.valueOf(cal.get(DAY_OF_WEEK))))
month_days[i].setTextColor(Color.RED);
else
month_days[i].setTextColor(Color.BLACK);
if (cal.get(MONTH) != conf.getCurrentCal().get(MONTH))
month_days[i].setTextAppearance(this.getActivity(), R.style.InActiveSmall);
else
month_days[i].setTextAppearance(this.getActivity(), R.style.SmallFont);
cal.add(DAY_OF_MONTH, 1);
}
if (WEEK_NUMBER_VISIBILITY) {
cal.set(conf.getCurrentCal().get(YEAR), conf.getCurrentCal().get(MONTH), 1);
i = cal.get(WEEK_OF_YEAR);
z = 0;
for (j = 0; j < wn; j++) {
weeks[j].setText(String.valueOf(cal.get(WEEK_OF_YEAR)));
if ((i == 52) && (z == Calendar.DECEMBER))
weeks[j].setText(String.valueOf(53));
weeks[j].setVisibility(VISIBLE);
i = cal.get(WEEK_OF_YEAR);
z = cal.get(MONTH);
cal.add(WEEK_OF_YEAR, 1);
}
} else {
cal.set(conf.getCurrentCal().get(YEAR), conf.getCurrentCal().get(MONTH), 1);
for (j = 0; j < 6; j++) {
weeks[j].setVisibility(INVISIBLE);
cal.add(WEEK_OF_YEAR, 1);
}
}
for (j = 1; j <= 6; j++)
if (j > wn)
tb_row[j].setVisibility(INVISIBLE);
else
tb_row[j].setVisibility(VISIBLE);
if (MONTH_NAME_VISIBILITY) {
month_name.setText(conf.getMonthName()[conf.getCurrentCal().get(MONTH)]);
month_name.setVisibility(VISIBLE);
}
else
month_name.setVisibility(INVISIBLE);
}
public void setConf(Configurations conf) {
this.conf.setCurrentCal(conf.getCurrentCal());
this.conf.setCAL_FIRST_WEEK_DAY(conf.getCAL_FIRST_WEEK_DAY());
this.conf.setDayName(conf.getDayName());
this.conf.setMonthName(conf.getMonthName());
this.conf.setPACKAGE_NAME(conf.getPACKAGE_NAME());
this.conf.setTodayCal(conf.getTodayCal());
this.conf.setWEEK_FREE_DAYS_INDEX(conf.getWEEK_FREE_DAYS_INDEX());
}
public void setmonth(Calendar cal){
Calendar tcal = getInstance();
tcal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
this.conf.setCurrentCal(tcal);
}
}
public类SampleFragment扩展片段{
私有文本视图[]月日;
私有文本视图[]周;
私有文本视图[]周/日;
private TableRow[]tb_row;
私有文本视图月份名称;
受保护布尔月\名称\可见性=false;
受保护的布尔周数可见性=false;
私有配置conf=新配置();
私有视图rootView;
@凌驾
创建时的公共void(Bundle savedInstanceState){
setRetainInstance(真);
super.onCreate(savedInstanceState);
}
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
rootView=充气机。充气(R.layout.month\u视图,容器,假);
初始化(this.getActivity());
设置日期();
返回rootView;
}
私有void初始化(上下文){
月日=新文本视图[42];
周=新文本视图[6];
周\天=新文本视图[7];
tb_行=新表行[7];
month\u name=(TextView)rootView.findViewById(R.id.month\u name);
整数i,j,id;
对于(i=0;i<42;i++){
id=rootView.getResources().getIdentifier(“tv”+(i+1)+”,“id”,conf.getPACKAGE_NAME());
月日[i]=(TextView)rootView.findViewById(id);
}
对于(i=0;i<6;i++){
id=rootView.getResources().getIdentifier(“tvw”+(i+1)+“”,“id”,conf.getPACKAGE_NAME());
周[i]=(TextView)rootView.findViewById(id);
周[i].settext外观(活动,R.style.SmallFontBold);
}
对于(i=0;i<7;i++){
id=rootView.getResources().getIdentifier(“tvwd”+(i+1)+“”,“id”,conf.getPACKAGE_NAME());
周天数[i]=(TextView)rootView.findViewById(id);
周/天[i].setText(conf.getDayName()[i]);
周/日[i].setTextAppearance(活动,R.style.SmallFontBold);
if(Arrays.asList(conf.getWEEK\u FREE\u DAYS\u INDEX()).contains(String.valueOf(i)))
周/日[i].setTextColor(Color.RED);
id=getResources().getIdentifier(“行”+(i+1)+”,“id”,conf.getPACKAGE_NAME());
tb_row[i]=(TableRow)rootView.findviewbyd(id);
}
}
公共无效设置日期(){
Calendar cal=Calendar.getInstance();
setFirstDayOfWeek(conf.getCurrentCal().getFirstDayOfWeek());
整数i,j=0,wn,backday,z;
set(conf.getCurrentCal().get(年),conf.getCurrentCal().get(月),1);
backday=((cal.get(每周的第几天))-cal.getFirstDayOfWeek()+7)%7;
wn=(int)(Math.ceil((backday+cal.getactualmax(每月的第几天))/7.0));
加上(一周中的第二天-后一天);
对于(i=0;i
过了一会儿,没有人回答我的问题!
所以在不同的网站上搜索了很多,最后我找到了一种完全保存碎片的方法!!
在这种情况下,您应该创建没有UI的片段(和)!并在片段上设置setRetainInstance(true)。请像您所做的那样发布您的代码?@Y.S他并没有编写任何代码,他们只是想了解目前的意见或实现其目标的方法…..basiccall