Android屏幕方向已更改,以编程方式添加的文本视图不会保存
基本上我有两项活动。主活动有一个按钮,该按钮指向第二个活动,该活动指定textview的名称(具体为三个textview)。之后,返回主活动,textview的指定名称将显示在第一个活动上,但textview是以编程方式添加的,并根据其名称添加到不同的表行中。我的问题是,当屏幕方向从纵向更改为横向时,通过编程添加的文本视图不会保存。如何保存这些值?我尝试过android:configChanges,但它根本不保存任何内容。将添加文本视图的代码放入一个方法中,并在onCreate和OnConfiguration Changed中调用它Android屏幕方向已更改,以编程方式添加的文本视图不会保存,android,android-activity,views,android-orientation,Android,Android Activity,Views,Android Orientation,基本上我有两项活动。主活动有一个按钮,该按钮指向第二个活动,该活动指定textview的名称(具体为三个textview)。之后,返回主活动,textview的指定名称将显示在第一个活动上,但textview是以编程方式添加的,并根据其名称添加到不同的表行中。我的问题是,当屏幕方向从纵向更改为横向时,通过编程添加的文本视图不会保存。如何保存这些值?我尝试过android:configChanges,但它根本不保存任何内容。将添加文本视图的代码放入一个方法中,并在onCreate和OnConfig
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
addTextViews();
}
默认情况下,android将在配置更改时重新创建您的UI(在您的情况下,屏幕旋转更改),现在由于您的文本视图/小部件是在运行时添加的,所以它们不会由android重新创建,因为它们在android将重新膨胀和添加的XML布局中不可用 对于要执行此操作的解决方案,通过实现
onSaveInstanceState
,保存动态添加视图的值,在存储值时使用这些视图ID作为键(可能使用行ID作为视图ID)
现在,当配置更改时,根据保存的值重新创建视图并用保存的值填充它们,我想这些信息可能会帮助您解决这个问题。重写onSaveInstanceState方法并放置所有要保存的值。让他们回到onRestoreIntanceState方法中 更新 保存所需的值
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString(KEY, VALUE);
...
}
恢复值
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState != null){
String str = savedInstanceState.getString(KEY);
//Set str to your text view
}
}
据我所知,在第二个活动中,您需要指定将分配给第一个主要活动中的几个文本视图的文本 我推荐两种方式:
savedInstanceState
,onSaveInstanceState()
保存并提取以编程方式设置的文本视图的字符串android:configChanges=“orientation | screenSize”
应用于主活动,以防止其被重新创建您还可以看到差异(2个已更改的文件,添加了4个,删除了17个)。您好,谢谢您回答我的问题。我试试这个。:)您好,您的意思是我将把添加的文本视图放在onActivityResult上吗?因为文本视图名称的结果将基于第二个活动的意图。不,但是您应该将名称保存在变量中,并在添加文本视图时使用它。谢谢您回答我的问题。我应该包括以编程方式放置ID吗?是的,使用setIDAPI来实现!!void initializeTextView(){mTextView=new TextView(this);mTextView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));mTextView.setGravity(Gravity.CENTER);mTextView.setId(100)}@Override受保护的void onSaveInstanceState(Bundle outState){//TODO自动生成的方法存根super.onSaveInstanceState(outState);outState.putString(100,“textViewString”);}很抱歉,我的思路正确吗?我在以编程方式初始化textview和onSaveInstanceState方法时提供了代码。您好,感谢您回答我的问题。如果您能给我一个如何执行此操作的示例,我对如何将其保存在以编程方式添加的textview上感到困惑。谢谢,这真的很有帮助!