我目前正在为Android平台开发一个多线程游戏应用程序...到目前为止一切都很好......我刚刚在我的应用程序中遇到了一个错误,导致它在方向更改时重新启动(通过指定具体方向来修复)关于硬件键盘的可用性与否,这是重要的"因为它是一个具有聊天功能的在线游戏",并且有效......但是现在我试图避免在用户只需滑动打开硬件键盘时出现同样的问题.我不太确定如何避免重启我的应用程序或保存我的应用程序状态.任何解决方案/建议?
我很难找到更好的实施方法:
1)数据缓存,因为我通过AsyncTask在每个片段中执行3-4次从其他API获取数据,我想要的是从缓存重新加载数据而不是AsyncTask再次调用.
2)处理配置更改事件的方法...例如方向更改或一些其他事件.
混淆:数据缓存和配置变化有什么关系吗?如果是这样,只有缓存代码才能满足这两个问题的目的吗?
我尝试过的:这是一个为配置更改部分提供了神奇的项目, 这个库项目可以提供数据缓存的目的
或者我应该按照google io 2013中的建议使用排球库?
我的模型:我有一个控制的ACTIVITY和执行部分的七个其他特定片段.如果您有任何想法如何继续,请输入您的单词?
performance android caching android-configchanges android-fragments
我已经和这个人争吵了一段时间 - 我在这里广泛搜索了答案,但没有发现任何答案(如果我错过了一个决议,那么道歉).我正在实施"使用Google登录"按钮/逻辑,除了更改设备方向外,所有工作都很正常.在这种情况下,我会看到Google的权限对话框的多个副本.(因此,如果我更改方向三次,则在返回到我的原始屏幕之前,我必须取消三个权限对话框的副本).(可以在此处找到权限对话框的示例).
我认为我的代码过于复杂,所以除了谷歌教程页面(入门/登录)中的代码外,我做了一个新的活动,我仍然遇到同样的问题.(以下代码)
(FWIW,我也尝试使用IntelliJ的"新建 - >活动 - >登录活动"选项创建一个新的活动,结果相同.)
除此之外,我尝试运行谷歌的"快速启动"应用程序,是的,同样的问题仍在发生!
有没有其他人成功实施"使用Google登录"而没有此行为?我认为作为最后的手段,我可以强制我的身份验证活动始终以纵向显示,但我正在尝试查看是否有超出此范围的解决方案.
先感谢您!
以下是我的"简化"活动的代码:
package com.myapp.test.view.housekeeping;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;
import com.myapp.test.R;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;
public class AuthenticateActivity_BareBones extends ActionBarActivity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
/* Request code used to invoke sign in user interactions. */
private static final int RC_SIGN_IN = 1;
/* Client used to interact with Google APIs. */
private GoogleApiClient mGoogleApiClient;
/* A …Run Code Online (Sandbox Code Playgroud) android google-login android-configchanges android-orientation
所以,我发现有两种方法可以在Android中获取系统的语言环境:
Locale.getDefault()
Run Code Online (Sandbox Code Playgroud)
和
getResources().getConfiguration().locale
Run Code Online (Sandbox Code Playgroud)
基本上问题是 - 这两个输出可以不同吗?或者它们总是一样,我可以使用第一个,因为它不需要Context对象?
自从2009 AsyncTask年在Cupcake(API 3,Android 1.5)中推出以来,它一直被Android团队一直推广为:
他们提供的代码示例强化了这种简单的信息,特别是对于那些不得不以更痛苦的方式使用线程的人.AsyncTask非常有吸引力.
然而,在此后的许多年里,崩溃,内存泄漏和其他问题困扰了大多数选择AsyncTask在其生产应用程序中使用的开发人员.这通常是由于Activity 破坏和娱乐上运行时配置的变化(特别是取向/旋转),而AsyncTask运行doInBackground(Params...); 当onPostExecute(Result)被调用时,Activity已经被破坏,使UI引用处于不可用状态(或甚至null).
Android团队在这个问题上缺乏明显,清晰,简洁的指导和代码样本只会让事情变得更糟,导致混乱以及各种变通方法和黑客攻击,有些体面,有些可怕:
显然,既然AsyncTask可以在很多情况下使用,那么就没有一种方法可以解决这个问题.然而,我的问题是关于选择.
什么是规范(由Android团队认可)最佳实践,使用简洁的代码示例,AsyncTask与Activity/ Fragmentlifecycle 集成并在运行时配置更改时自动重启?
android android-lifecycle android-configchanges android-asynctask android-memory
所以我使用一个按钮将语言从英语切换到法语!
我的问题是我只需要知道我当前应用程序的语言,而不是我设备的语言。
我正在使用这些代码行来了解当前的语言
Locale.getDefault().getLanguage()
Run Code Online (Sandbox Code Playgroud)
但显然他正在返回我的设备语言。
任何帮助将不胜感激 。
呵呵,这是一个艰难的。至少,我是这么认为的……澄清一下:
搜索互联网后(使用谷歌),我没有找到我的问题的任何答案。
我发现的一切都是关于人们onClickListener为他们View的错误设置的。我想在我的情况下这是同样的问题,但没有其他问题与我的匹配。
这似乎是同样的问题......它没有答案。
我有三只Fragment的成立连同ViewPager我的AppCompatActivity。
viewPager = (ViewPager) findViewById(R.id.main_view_pager);
viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
Run Code Online (Sandbox Code Playgroud)
由SectionsPagerAdapter.
public class SectionsPagerAdapter extends FragmentPagerAdapter {
SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return MainTextHolder.newInstance(tabIndicatorOnClick);
case 1:
return PostWriter.newInstance(tabIndicatorOnClick);
case 2:
return TopPage.newInstance(tabIndicatorOnClick);
default:
return Error.newInstance();
}
}
@Override
public int getCount() {
return 3;
}
// ... more methods …Run Code Online (Sandbox Code Playgroud) 我是android开发的新手.我开发了一个应用程序,现在的问题是每当我旋转屏幕时,应用程序再次启动活动然后崩溃应用程序.我在google上找到了一些解决方案来使用android:configChanges ="orientation".它工作正常但是当我旋转屏幕时,它的屏幕尺寸不会改变.如何解决这个问题呢 ?
Logact:
05-28 14:32:52.038:E/AndroidRuntime(276):FATAL EXCEPTION:main 05-28 14:32:52.038:E/AndroidRuntime(276):java.lang.IllegalArgumentException:视图未附加到窗口管理器05- 28 14:32:52.038:E/AndroidRuntime(276):在android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)05-28 14:32:52.038:E/AndroidRuntime(276):在android.view. WindowManagerImpl.removeView(WindowManagerImpl.java:200)05-28 14:32:52.038:E/AndroidRuntime(276):at android.view.Window $ LocalWindowManager.removeView(Window.java:432)05-28 14:32: 52.038:E/AndroidRuntime(276):在android.app.Dialog.dismissDialog(Dialog.java:278)05-28 14:32:52.038:E/AndroidRuntime(276):在android.app.Dialog.access $ 000( Dialog.java:71)05-28 14:32:52.038:E/AndroidRuntime(276):在android.app.Dialog $ 1.run(Dialog.java:111)05-28 14:32:52.038:E/AndroidRuntime (276):在android.app.Dialog.dismiss(Dialog.java:268)05-28 14:32:52.038:E/AndroidRuntime(276):在android.app.Dialog.cancel(Dialog.java:951) 05-28 14:32:52.0 38:E/AndroidRuntime(276):at com.MobileWeb.mytestbuddy.PremiumMain $ TheTask.onPostExecute(PremiumMain.java:373)05-28 14:32:52.038:E/AndroidRuntime(276):at com.MobileWeb.mytestbuddy .PremiumMain $ TheTask.onPostExecute(PremiumMain.java:1)05-28 14:32:52.038:E/AndroidRuntime(276):at android.os.AsyncTask.finish(AsyncTask.java:417)05-28 14:32 :52.038:E/AndroidRuntime(276):在android.os.AsyncTask.access $ 300(AsyncTask.java:127)05-28 14:32:52.038:E/AndroidRuntime(276):at android.os.AsyncTask $ InternalHandler .handleMessage(AsyncTask.java:429)05-28 14:32:52.038:E/AndroidRuntime(276):at android.os.Handler.dispatchMessage(Handler.java:99)05-28 14:32:52.038:E/AndroidRuntime(276):在android.os.Looper.loop(Looper.java:123)05-28 14:32:52.038:E/AndroidRuntime(276):在android.app.ActivityThread.main(ActivityThread.java: 4627)05-28 14:32:52.038:E/AndroidRuntime(276):at java.lang.reflect.Method.invokeNative(Native Method)05-28 14:32:52.038:E/AndroidRuntime(276):at java .lang.reflect.Me thod.invoke(Method.java:521)05-28 14:32:52.038:E/AndroidRuntime(276):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)05-28 14:32:52.038:E/AndroidRuntime(276):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)05-28 14:32:52.038:E/AndroidRuntime(276):at dalvik .system.NativeStart.main(Native方法)
我正在开发一个支持两种不同语言的应用程序 -
用户可以随时切换到任何语言,并根据我正在更改应用程序语言的选择。
下面提到的是代码片段 -
public static void setLocale(String languageCode, Context ctx) {
Locale locale = new Locale(languageCode);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= VERSION_CODES.N) {
updateResourcesLocale(ctx, locale);
} else {
updateResourcesLocaleLegacy(ctx, locale);
}
}
private static void updateResourcesLocale(Context context, Locale locale) {
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
context.getApplicationContext().createConfigurationContext(configuration);
}
private static void updateResourcesLocaleLegacy(Context context, Locale locale) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
configuration.setLayoutDirection(locale);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
同样在应用程序的每个活动中,我都覆盖了attachBaseContext方法。我在其中使用了以下逻辑-
@Override
protected void attachBaseContext(Context …Run Code Online (Sandbox Code Playgroud) 引用文档:
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,"屏幕大小"也会更改.因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则除了"orientation"值之外,还必须包含"screenSize"值.也就是说,你必须decalare android:configChanges ="orientation | screenSize"
我需要忽略screenSize配置更改.我的最低SDK级别为8(Android 2.2),目标SDK级别为13.因此,我需要在清单中引入它.
但是,Eclipse无法识别它,因为其Android设置设置为2.2.所以我把它改成了适当的级别,现在它正确构建.
但是,我担心在screenSize配置更改尚未提供的旧版本中会出现问题.(例如,当应用程序在Android 2.2.设备上运行时.)也就是说,应用程序在读取清单时会崩溃,因为screenSize它将是一个未知值.或者它会在3.2之前的设备上忽略它?
PS:我现在没有机会在真实的设备上进行测试,在这样一个关键问题上,我不会相信模拟器.
java android android-manifest screen-size android-configchanges
我正在使用一个应用程序,例如带有一些机密信息的 chrome,我正在将其切换到后台 & 我试图终止该应用程序。
我在尝试杀死应用程序时上传了示例图像。即使会话已过期,当应用程序进入前台时,它也不会在终止阶段关闭信息,然后仅关闭信息。我希望信息在进入后台时应该关闭或隐藏(在杀死阶段)。
我在谷歌搜索我没有得到任何与此相关的信息,我不知道我的搜索短语是否正确。任何人都可以请帮助我。
此项目是可在Android Studio中找到的主/明细流模板的扩展.不同之处在于此应用程序使用单个Activity和一个管理三个片段的ViewPager.第三个片段是Master(列表)片段,其中包含可点击的RecycleView.单击列表项时,它会使用子(详细信息)片段切换片段.
当项目有效时,我想避免android:configChanges= "orientation|keyboardHidden|screenSize"在清单中使用.我该怎么做?
如果删除该属性,则ItemListFragment中的mListener在旋转时会与ItemFragmentList一起销毁,但在重新创建ItemListFragment时永远不会重新创建.在纵向模式下单击列表项时,这不会发生任何事情.
我最初的解决方案是手动覆盖配置更改处理,这意味着在旋转屏幕时不会销毁ItemListFragment.onConfigurationChanged()并populateViewForOrientation()加入到重新充气的布局.当然,有一种比手动覆盖配置处理更好的解决方案.
项目可在:https://github.com/lukeallison/ViewPagerMasterDetail,视频:http://tinypic.com/r/1zltyeq/9
BaseFragment.java
public class BaseFragment extends Fragment {
public Bridge mBridget;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mBridget = (MainActivity) getActivity();
}
}
Run Code Online (Sandbox Code Playgroud)
接口:Bridge.java
public interface Bridge {
abstract void onBack();
}
Run Code Online (Sandbox Code Playgroud)
ItemListFragment.java
public class ItemListFragment extends BaseFragment{
private boolean mTwoPane = false;
private PageFragmentListener mListener;
public static ItemListFragment newInstance(PageFragmentListener listener) {
ItemListFragment fragment = new ItemListFragment();
fragment.mListener = listener; …Run Code Online (Sandbox Code Playgroud) android android-manifest android-layout android-configchanges android-fragments
我在应用程序中捕获方向更改时遇到问题.我希望防止在重新定位设备时重新启动我的应用表单.
我的应用程序中共有3个活动(第三个是FragmentActivity).主要的用户交互是通过FragmentActivity.
我更改了清单,以便所有活动都具有以下属性:
android:configChanges="orientation"
我还在onConfigurationChanged()所有活动中重写了该方法,并查看它是否实际上被调用我已经包含了一个Log.i()语句但是没有任何报告.
我正在使用模拟器对此进行测试,并且当我执行CTRL + F12时会报告方向更改.
I/ActivityManager(67):配置已更改:{scale = 1.0 imsi = 310/260 loc = en_US touch = 3 keys = 2/1/2 nav = 3/1 orien = 1 layout = 34 uiMode = 17 seq = 10}
我有什么东西在迷茫吗?
android ×13
java ×2
caching ×1
google-login ×1
locale ×1
localization ×1
performance ×1
screen-size ×1