我有一个登录屏幕,其中包含2个用于用户名和密码的EditTexts.我的要求是,在方向更改时,EditText中的输入数据(如果有)应保持原样,并且还应绘制新布局.我有2个布局xml文件 - 一个在布局文件夹中,另一个在layout-land文件夹中.我正在尝试实现以下两种方法,但它们都不是完美的:
(1)configChanges:keyboardHidden -在这种方法中,我没有在清单文件中的configChanges中提供"orientation".所以我在onCreate()和onConfigurationChanged()方法中都调用了setContentView()方法.它符合我的要求.布局已更改,EditTexts中的输入数据也保持不变.但它有一个很大的问题:
当用户单击"登录"按钮时,将显示ProgressDialog,直到收到服务器响应.现在,如果用户在ProgressDialog运行时旋转设备,则应用程序崩溃.它显示一个异常,说"视图无法附加到窗口".我试图使用onSaveInstanceState处理它(它会在方向更改时被调用)但应用程序仍然崩溃.
(2)configChanges:orientation | keyboardHidden -在这种方法中,我在清单中提供"方向".所以现在我有两个场景:
(a)如果我在onCreate()和onConfigurationChanged()中调用setContentView()方法,则相应地更改Layout,但EditText数据会丢失.
(b)如果我在onCreate()中调用setContentView()方法,而不是onConfigurationChanged(),则EditText数据不会丢失,但布局也不会相应地更改.
在这种方法中,甚至没有调用onSaveInstanceState().
所以我处在一个非常令人生畏的境地.有没有解决这个问题的方法?请帮忙.Thanx提前.
是否可以一次启动多个活动?我的意思是,从主要创建3个活动按某种顺序,只是最后一个将是可见的?到目前为止,我只能创建一个活动.
谢谢
我发布了一个应用程序,其中一个基本功能是允许用户拍照,然后将该照片保存在其外部存储的特定文件夹中.
一切似乎都运行正常,但我现在有两个报告声称在拍照后,点击"完成"退出相机(并返回活动),应用程序被强制关闭,带来用户回到主屏幕.
这发生在Samsung Nexus S和Galaxy Tab上.下面我发布了我的代码,以显示我设置我的意图以及如何在onActivityResult()中处理保存和显示照片.任何关于在点击"完成"退出相机应用程序后可能导致崩溃的指导,将不胜感激!
同样,这似乎在大多数设备上都能正常工作,但我想知道它们是否是一种更有效,更通用的方法.谢谢
我如何解雇相机意图
case ACTION_BAR_CAMERA:
// numbered image name
fileName = "image_" + String.valueOf(numImages) + ".jpg";
output = new File(direct + File.separator + fileName); // create
// output
while (output.exists()) { // while the file exists
numImages++; // increment number of images
fileName = "image_" + String.valueOf(numImages) + ".jpg";
output = new File(outputFolder, fileName);
}
camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
uriSavedImage = Uri.fromFile(output); // get Uri of the output
camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); //pass in Uri to camera …Run Code Online (Sandbox Code Playgroud) 我刚刚开始在android学习编程,我在使用变量时遇到了问题onSaveInstanceState.这是我的代码:
int resultCode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (savedInstanceState != null) {
super.onRestoreInstanceState(savedInstanceState);
int resultCode = savedInstanceState.getInt("resultCode");
}
Button btnOpenWithResult = (Button) findViewById(R.id.btnOpenWithResult);
btnOpenWithResult.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent myIntent = new Intent(flashlight.this, ThirdActivity.class);
startActivityForResult(myIntent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
/** option 1 */
break;
case 2:
/** option 2 */
break;
} …Run Code Online (Sandbox Code Playgroud) 我想在我现有的Android应用程序中使用底部导航栏,但问题是所有屏幕都是活动,是否可以加载活动而不隐藏底部导航栏.
示例: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:id="@+id/myScrollingContent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Your loooooong scrolling content here. -->
</android.support.v4.widget.NestedScrollView>
<com.roughike.bottombar.BottomBar
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="bottom"
app:bb_tabXmlResource="@xml/bottom_bar"
app:bb_behavior="shy"/>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的基础活动,
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomBar bottomBar;
bottomBar = (BottomBar) findViewById(R.id.bottomBar);
bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
@Override
public void onTabSelected(@IdRes int tabId) {
if (tabId == R.id.matching) {
Log.i("matching","matching inside "+tabId);
Intent in=new Intent(getBaseContext(),Main2Activity.class);
startActivity(in);
}else if (tabId == R.id.watchlist) …Run Code Online (Sandbox Code Playgroud) 我需要在onStart()方法上采取不同的行动,这取决于onCreate()结果是否被调用orientation change.有可能检查一下吗?
实际上我需要的是something在活动开始时做的事情, 除非用户改变方向的情况.
我需要清楚地区分用户刚刚切换到另一个应用程序并返回的情况,或者他改变了设备的方向.
我有一个小的测试应用程序我正在使用它有一个计时器,将textview更新从100倒数到0.这很好,但现在我试图暂停应用程序,如果用户按下手机上的后退按钮然后从他们重新打开应用程序时停止的位置重新启动计时器.这是我正在使用的代码:
@Override
public void onPause()
{
if(this._timer_time_remaining > 0) {
this.timer.cancel();
}
super.onPause();
Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining));
}
@Override
public void onResume()
{
Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining));
if(this._timer_time_remaining > 0) {
start_timer(this._timer_time_remaining);
}
super.onResume();
}
Run Code Online (Sandbox Code Playgroud)
start_timer()方法创建一个CountDownTimer,它更新onTick方法中的textview并更新this._timer_time_remaining int变量.
CountDownTimer和_timer_time_remaining都在类级别声明,如下所示:
private CountDownTimer timer;
private int _timer_time_remaining;
Run Code Online (Sandbox Code Playgroud)
从Log.v()打印我看到_timer_time_remaining变量在调用onPause时存储了正确的秒数,但是在onResume启动时它被设置回0.为什么变量会被重置?我认为应用程序将继续在后台运行相同的值.我错过了什么吗?这都是在扩展Activity的类中声明的.
提前致谢!
注意:编辑清理代码复制
当我在Android设备上测试我的应用程序时,将我的Android手机从横向变为纵向,我的列表视图中的所有列表项的结果都消失了.
为什么?
怎么管理?
保存包(活动A):
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("test", "value");
super.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)
导航到活动B;
startActivity(new Intent(getBaseContext(), B.class));
Run Code Online (Sandbox Code Playgroud)
回到活动A:
startActivity(new Intent(getBaseContext(), A.class));
Run Code Online (Sandbox Code Playgroud)
试图在活动A中加载我写入bundle的值:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("MY", "saved instance is null"+ Boolean.toString(savedInstanceState == null));
}
Run Code Online (Sandbox Code Playgroud)
返回总是savedInstanceState = null.我在这里缺少什么?
当我返回主活动时,永远不会触发onRestoreInstanceState
试图决定(对于我的应用程序)在onPause()中保存什么以及在onSaveInstanceState()中保存什么,我梳理了整个SO以获取提示和明确的指导.
如果我理解正确,onSaveInstanceState()最适合保存"运行时更改"或"当前状态"(无论这意味着什么),而onPause()最适合保存"持久状态"(无论这意味着什么).
我仍然难以确定我的申请中的内容构成"持久状态"与"当前状态".例如,虽然用户偏好显然是持久的,但是onPause()当用户更改它们时,Android UI框架总是自动保存它们时是否需要保存它们?
类数据成员是否需要保存在onSaveInstanceState()中?我是否需要为我的应用程序中的每个类执行此操作?
我很迷惑.
你能带来真实世界的例子,说明必须保存的内容onPause()和必须保存的内容onSaveInstanceState()吗?除了设备配置更改,即.
-
在我的问题得到解答后,一些新的见解:
android application-state activity-lifecycle onpause android-activity