Android屏幕方向已更改,以编程方式添加的文本视图不会保存

Android屏幕方向已更改,以编程方式添加的文本视图不会保存,android,android-activity,views,android-orientation,Android,Android Activity,Views,Android Orientation,基本上我有两项活动。主活动有一个按钮,该按钮指向第二个活动,该活动指定textview的名称(具体为三个textview)。之后,返回主活动,textview的指定名称将显示在第一个活动上,但textview是以编程方式添加的,并根据其名称添加到不同的表行中。我的问题是,当屏幕方向从纵向更改为横向时,通过编程添加的文本视图不会保存。如何保存这些值?我尝试过android:configChanges,但它根本不保存任何内容。将添加文本视图的代码放入一个方法中,并在onCreate和OnConfig

基本上我有两项活动。主活动有一个按钮,该按钮指向第二个活动,该活动指定textview的名称(具体为三个textview)。之后,返回主活动,textview的指定名称将显示在第一个活动上,但textview是以编程方式添加的,并根据其名称添加到不同的表行中。我的问题是,当屏幕方向从纵向更改为横向时,通过编程添加的文本视图不会保存。如何保存这些值?我尝试过android:configChanges,但它根本不保存任何内容。

将添加文本视图的代码放入一个方法中,并在onCreate和OnConfiguration Changed中调用它

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上感到困惑。谢谢,这真的很有帮助!