0

我一直在寻找解决方案,以便在手机更改方向时如何让我的应用不会丢失数据。我找到了一个,它将这行代码添加到Android清单中。所以,我做到了:Android方向更改丢失数据解决方案无法正常工作

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" 
     android:configChanges="orientation|keyboardHidden"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

我的数据还是迷路时方向的变化,任何人都可以帮我吗?非常感谢你。

我的Java代码:

public class MainActivity extends AppCompatActivity { 
int scoreofShooter1 = 0; 
int scoreofShooter2 = 0; 

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void addOneForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 1; 
    displayForShooter1(scoreofShooter1); 
} 

public void addTwoForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 2; 
    displayForShooter1(scoreofShooter1); 
} 
public void addThreeForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 3; 
    displayForShooter1(scoreofShooter1); 
} 

public void addFourForShooter1(View view) { 
    scoreofShooter1 = scoreofShooter1 + 4; 
    displayForShooter1(scoreofShooter1); 
} 

public void addOneForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 1; 
    displayForShooter2(scoreofShooter2); 
} 

public void addTwoForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 2; 
    displayForShooter2(scoreofShooter2); 
} 
public void addThreeForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 3; 
    displayForShooter2(scoreofShooter2); 
} 

public void addFourForShooter2(View view) { 
    scoreofShooter2 = scoreofShooter2 + 4; 
    displayForShooter2(scoreofShooter2); 
} 

public void resetScoreOfShooter1(View view) { 
    scoreofShooter1 = 0; 
    displayForShooter1(scoreofShooter1); 
} 

public void resetScoreOfShooter2(View view) { 
    scoreofShooter2 = 0; 
    displayForShooter2(scoreofShooter2); 
} 

public void displayForShooter1(int score) { 
    TextView scoreView = (TextView) findViewById(R.id.shooter_1_score); 
    scoreView.setText(String.valueOf(score)); 
} 


public void displayForShooter2(int score) { 
    TextView scoreView = (TextView) findViewById(R.id.shooter_2_score); 
    scoreView.setText(String.valueOf(score)); 
} 

}

+1

的[保存数据并改变方向]可能的复制(http://stackoverflow.com/questions/12214600/save-数据和变化的方向) –

+0

嗨,对不起,它看起来像一个重复的,但我已经读过这个话题,并不明白我的错误在哪里,所以我会非常高兴,如果有人帮助我的这个问题的具体情况,非常感谢你的理解。 – Veranicus

回答

1

更改此:

android:configChanges="orientation|keyboardHidden"> 

到:

android:configChanges="orientation|keyboardHidden|screenSize"> 

“定位”: 屏幕方向已更改 - 用户已旋转 设备。

注意:如果您的应用程序面向API级别13或更高(如通过中的minSdkVersion和targetSdkVersionattributes宣布 ),那么你应该 还申报“屏幕尺寸”的配置,因为它也改变 时之间的设备切换肖像和风景取向。

0

你的解决方案是在本great article

也许hackiest和滥用最广泛的解决方法是通过设置在Android禁用默认的破坏,和重建的行为表示不好的做法:configChanges在属性您Android清单。这种方法的表面简单性使其对开发人员非常有吸引力;但Google工程师不鼓励使用它。主要关心的是它要求您在代码中手动处理设备配置更改。处理配置更改要求您采取很多额外的步骤,以确保每个字符串,布局,可绘制,尺寸等与设备的当前配置保持同步,并且如果您不小心,应用程序可以很容易地拥有一个整体作为结果的一系列资源特定的错误。

另一个原因是谷歌不鼓励其使用,因为许多 开发商错误地认为设置 机器人:configChanges =“方向”(例如)将神奇 保护他们的应用程序无法预知的情况,其中 基本活动将被销毁并重新创建。这不是 的情况。配置更改可能会由于多种原因而发生 - 不仅仅是屏幕方向更改 。将您的设备插入显示器底座 更改默认语言并修改设备的默认字体比例因子只是可触发设备配置更改的事件的三个​​示例,所有这些事件都表示系统将销毁 并重新创建所有设备当前正在运行的活动下一次他们是 恢复。因此,设置android:configChanges属性通常不是很好的做法。

有两种情况:1 如果你只需要保存一些属性只使用onSavedInstanceStateonRestoreInstanceState

2 - 如果你有,你有正在运行的线程,AsyncTasks,插座更复杂的情形。 你可以:

1-管理对象内部的残留片段所描述here

2-更好的解决方案是使用设置是为了解决这一确切的问题loaders

从Android的文档:

  • 如果您获取直接在活动或片段中的数据,您的用户将缺乏响应遭受由于从UI线程执行可能慢查询。

  • 如果你从另一个线程获取数据,也许的AsyncTask,那么你负责管理线程和UI线程 通过各种活动或片段生命周期事件双方,如 的onDestroy()和配置变化。

装载机解决了这些问题,并包括其他好处。例如:

加载程序在单独的线程上运行以防止janky或无响应的UI。 当发生事件时,加载程序通过提供回调方法来简化线程管理。加载程序持续并缓存配置 更改以防止重复查询。装载程序可以实现一个 观察器来监视基础数据源中的更改。例如,对于 示例,CursorLoader会自动注册一个ContentObserver到 ,当数据更改时触发重新加载。

特定的情形

使用下面的代码:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null) { 
     scoreofShooter1 = savedInstanceState.getInt("scoreofShooter1"); 
     scoreofShooter2 = savedInstanceState.getInt("scoreofShooter2"); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("scoreofShooter1", scoreofShooter1); 
    outState.putInt("scoreofShooter2", scoreofShooter2); 
} 
+0

链接[2]坏了/不是有效的链接 – Zharf

+0

谢谢,我更新了我的链接 – humazed

+0

嗨,非常感谢你的帮助。第一个发布的解决方案是一个不好的做法,但我的应用程序并不复杂,我可以通过onSavedInstanceState和onRestoreInstanceState完成,问题是我不知道如何实现这一点,并相信我已经尝试过并阅读吨的文件,但我的技能很低,即使这对我来说是一个问题,我是一个完整的初学者。我已经将我的Java代码发布到了我的第一篇文章中,所以如果你愿意这么友善并期待它,并且只是发布了一些精确的代码,我就可以在那里工作 – Veranicus

相关问题