希望有人可以帮助我弄清楚,如果不是解决方案,至少可以解释一个行为.
问题:
在某些设备上,按启动器图标会导致当前任务恢复,而在其他设备上则会导致初始启动意图被触发(有效地重新启动应用程序).为什么会这样?
细节:
当您按下"启动器图标"时,应用程序会正常启动 - 也就是说,我认为,会Activity
使用操作android.intent.action.MAIN
和类别以您的第一个名称启动一个Intent android.intent.category.LAUNCHER
.但情况并非总是如此:
在大多数设备上,如果在应用程序运行后按下启动器图标,则恢复该进程中当前运行的活动(不是初始Activity
).它的恢复方式与从OS菜单中的"Recent Tasks"中选择它的方式相同.这是我想要在所有设备上执行的操作.
但是,在选定的其他设备上会出现不同的行为
在摩托罗拉Xoom上,当您按下启动器图标时,无论当前运行的是什么,应用程序都将始终启动初始启动Activity
.我假设启动器图标总是启动"启动器"意图.
在Samsung Tab 2上,当您按下启动器图标时,如果您刚刚安装了应用程序,它将始终启动初始设置Activity
(与Xoom相同) - 但是,在安装后重新启动设备后,启动器图标将改为恢复应用程序.我假设这些设备在设备启动时将"已安装的应用程序"添加到查找表中,这允许启动器图标正确地恢复正在运行的任务?
我读过许多回答听起来类似我的问题,但简单地添加android:alwaysRetainTaskState="true"
或使用launchMode="singleTop"
的Activity
不是答案.
编辑:
在最近发布此应用程序后,我们发现在首次重新启动后,所有设备上都会出现此行为.这看起来很疯狂,但通过重启过程,我实际上无法找到出错的地方.
我想知道这是否是Android API中的一个错误:
我有这样的设置:
?----?---------?
| | |
| 1 | 2 |
| |?-------?|
| || ||
| || 3 ||
?----??-------??
Run Code Online (Sandbox Code Playgroud)
此功能在手机上非常有效(其中1和2和3为ActivityFragment
s).
但是,当我使用此代码时:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment frag = new FragmentNumber2();
if(toLoad != null) frag.setArguments(toLoad);
transaction.replace(R.id.rightPane, frag);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
其中R.id.leftPane
和R.id.rightPane
是<fragment>
S IN水平线性布局.
据我所知,上面的代码删除了驻留的片段,然后用新的片段替换它.很棒......显然不会发生这种情况,因为当第二次运行此代码时会出现以下异常:
07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3
Run Code Online (Sandbox Code Playgroud)
这是因为FragmentNumber3的容器已被复制,并且它不再具有唯一ID.在添加新的片段之前,初始片段没有被销毁(?)(在我看来,这意味着它还没有被 …
每当我开始这项活动时,它总是从最低点开始 - 一直向下滚动到底部.我没有在活动OnCreate(或其他任何地方)做任何奇怪的事情,我希望改变滚动位置.我已经尝试将焦点设置到最顶层的可聚焦控件和scrollto方法,但它们都没有工作.此外,我的其他活动都没有这个问题.这是布局:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_refresh_update_header"
android:textSize="18sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="\n"
android:textSize="4sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Variable:"
android:textSize="18sp"/>
<Spinner
android:id="@+id/edit_refresh_variables_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="\n"
android:textSize="4sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Network:"
android:textSize="18sp"/>
<RadioGroup
android:id="@+id/widget1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<RadioButton
android:text="Web"
android:id="@+id/edit_refresh_update_rb_web"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="NetRadioButtonSelected"
android:checked="true"/>
<RadioButton
android:text="Socket Server"
android:id="@+id/edit_refresh_update_rb_socket_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="NetRadioButtonSelected"/>
</RadioGroup>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="\n"
android:textSize="4sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Socket server request type:"
android:textSize="18sp"/>
<Spinner
android:id="@+id/edit_refresh_socket_server_req_types_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView …
Run Code Online (Sandbox Code Playgroud) 我正在进行的项目要求我编写跨平台程序实现的android部分.
构建了一组核心功能,并将其包含在我的应用程序中android-ndk
.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:
NullPointerException
(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.
有人可以帮我解决如何应对崩溃本机代码的情况吗?
java-native-interface android exception-handling nullpointerexception android-ndk
虽然有关于把一个文件jstring
到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);
)我找不到这将转换为一个例子jboolean
,以一个bool
或jint
一个int
.
谁能建议如何实现这一目标?
我已经关注了developer.android.com上有关 输入法的示例,并使用了SoftKeyboard示例应用程序.这些共同提供了有关简单键盘创建的足够信息.
我在API中看不到的是能够在标准键盘(LatinIME键盘)上为每个键创建备用/多个字符.
上面的图像是长按"a"键的结果.当您长按一个键时,可以使用替换字符填充弹出窗口.
也可以在某些键上给出一个弹出提示,提示用户按住一个键以获得弹出菜单.
到目前为止,我还没有找到关于如何实现这一目标的单一信息来源,希望有人能够给我一个良好的开端,直到那时我将遵循内置键盘的源代码,看看我是否可以进行逆向工程它.
编辑:如果developer.android.com的LatinIME键盘链接没有链接到一个羊的图片会有帮助:) LatinIME.java的实际源代码.
编辑2:更多作为参考而不是其他任何东西,这是我认为通常的longPress操作通过以便在KeyboardView.java中显示弹出键盘的序列:
onTouchEvent()
onModifiedTouchEvent()
mHandkler.handleMessage() with MSG_LONGPRESS
openPopupIfRequired()
onLongPress()
Run Code Online (Sandbox Code Playgroud)
编辑3:
我仍然没有想到这一点 - 如何向键添加标签建议?答案表明它没有内置到API中,事实上我还没有找到代码来执行此操作.但是,2.3.4(API 10)上的键盘显示正在实现此功能:
非常想弄清楚IT是如何做到的,但它不是onDraw()
我能看到的方法中的任何地方- 这让我相信它是在KeyboardView元素之外编写的.然而,我无法找到layout
用于在内置键盘上显示KeyboardView元素的文件 - 如果有人知道在哪里找到这个也许会给我提供我需要的线索.
编辑4:移动键预览问题,因为它稍微偏离主题:
似乎有很多"类似"的问题和答案分散在其中,所有问题都涉及如何从中获取自定义属性AttributeSet
.到目前为止我无法找到的是如何获取android:
命名空间标记:
<com.custom.view.StatusThumbnail
android:id="@+id/statusThumbnailContainer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"/>
Run Code Online (Sandbox Code Playgroud)
我想layout_height
从这个自定义组件中拉回属性.不幸的是,从我所读到的最近,我必须要做的是:
public StatusThumbnail(Context context, AttributeSet attrs) {
super(context, attrs);
String height = attrs.getAttributeValue("android", "layout_height");
Run Code Online (Sandbox Code Playgroud)
但这会回来null
.
当然这不是一件罕见的事情吗?
请参阅下面的每个部分,以三种不同的方式描述我的问题.希望能帮助人们回答.
问题:在给定原始比例点和比例因子的情况下,如果只有以缩放图像表示的坐标,如何在画布/用户空间中找到一对坐标?
实践中的问题:
我目前正在尝试复制应用程序中使用的缩放功能,例如图库/地图,当您可以缩放缩放/缩小时缩放移向夹点的中点.
在向下我保存缩放的中心点(基于当前屏幕的X,Y坐标).然后我在检测到"缩放"手势时执行此功能:
class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(mScaleAllowed)
mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
CustomImageView的缩放功能如下所示:
public boolean scale(float scaleFactor, float focusX, float focusY) {
mScaleFactor *= scaleFactor;
// Don't let the object get too small or too large.
mScaleFactor = Math.max(MINIMUM_SCALE_VALUE, Math.min(mScaleFactor, 5.0f));
mCenterScaleX = focusX;
mCenterScaleY = focusY;
invalidate();
return true;
}
Run Code Online (Sandbox Code Playgroud)
通过覆盖onDraw方法来实现缩放图像的绘制,该方法在中心周围缩放画布并将图像绘制到其中.
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mCenterScaleX, mCenterScaleY);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(-mCenterScaleX, -mCenterScaleY);
mIcon.draw(canvas); …
Run Code Online (Sandbox Code Playgroud) 我有一个使用这种布局的虚假对话框:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/containerPageConatiner">
<FrameLayout android:id="@+id/dialogHolder"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:padding="15dp"
android:layout_gravity="center"
android:background="@drawable/panel_picture_frame_bg_focus_blue"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
我<FrameLayout>
根据打开的对话框放置一个片段- 控制Dialog的活动如下所示:
<activity
android:label="@string/app_name"
android:name=".activity.DialogActivity"
android:theme="@style/CustomTheme.Screen.Transparent"
android:windowSoftInputMode="adjustResize">
Run Code Online (Sandbox Code Playgroud)
不幸的是,当您单击对话框内的编辑文本时,不会进行大小调整.在windowSoftInputMode
字面上没有什么区别的功能是一样的全景模式.
文档说"这当然只适用于具有可调整区域的应用程序,可以缩小以留出足够的空间",但不会告诉您"可调整区域"的含义,并让我认为在某种程度上我不喜欢Ť有一个可调整大小的面积?
如果有人知道什么事可以帮助我吗?
编辑
如此围绕对话框不会改变任何东西:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/containerPageConatiner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/dialogHolder"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:padding="15dp"
android:layout_gravity="center"
android:background="@drawable/panel_picture_frame_bg_focus_blue"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
EDIT2
Scrollview作为父级也无济于事:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/containerPageConatiner"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/dialogHolder"
android:layout_width="wrap_content" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试一个简单的应用程序来阅读网站的HTML,并转换它以在Android中创建一个易于阅读的UI(这是一个学习android的exersize,而不是一个可用的应用程序).我遇到的问题是跨活动持久存在用户会话,然后在HttpClient
一次召回时使用会话.
我想"正确地"这样做,推荐的方法似乎是使用CookieManager
.然而,我遇到了这方面的问题 - 我似乎无法找到"正确"的方式来Cookie
从一个单独的活动中CookieManager
稍后实例化中使用它HttpClient
.
当使用CookieManager
我可以保存Cookie
和Cookie
随后在其他活动(见代码段2)的范围.我在请求页面时没有找到如何使用它(请参阅代码片段3).
够了,这里有一些代码.首先我的登录操作和Cookie存储:
private OnClickListener loginActionListener = new OnClickListener()
{
public void onClick(View v)
{
EditText usernameTextView = (EditText) findViewById(R.id.Username);
EditText passwordTextView = (EditText) findViewById(R.id.Password);
String username = usernameTextView.getText().toString();
String password = passwordTextView.getText().toString();
try {
HttpPost postMethod = new HttpPost(URI);
HttpParams params = new BasicHttpParams();
params.setParameter("mode", "login");
params.setParameter("autologin", true);
params.setParameter("username", username);
params.setParameter("password", password);
postMethod.setParams(params);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response …
Run Code Online (Sandbox Code Playgroud)