小编Gra*_*eme的帖子

应用程序重新启动而不是恢复

希望有人可以帮助我弄清楚,如果不是解决方案,至少可以解释一个行为.

问题:

在某些设备上,按启动器图标会导致当前任务恢复,而在其他设备上则会导致初始启动意图被触发(有效地重新启动应用程序).为什么会这样?

细节:

当您按下"启动器图标"时,应用程序会正常启动 - 也就是说,我认为,会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 android-lifecycle

179
推荐指数
5
解决办法
6万
查看次数

碎片中的碎片

我想知道这是否是Android API中的一个错误:

我有这样的设置:

?----?---------?
|    |         |
|  1 |    2    |
|    |?-------?|
|    ||       ||
|    ||   3   ||
?----??-------??
Run Code Online (Sandbox Code Playgroud)
  1. 是一个在右侧窗格中加载片段#2(搜索屏幕)的菜单.
  2. 是包含片段#3的搜索屏幕,片段#3是结果列表.
  3. 结果列表在几个地方使用(包括作为一个功能正常的高级片段).

此功能在手机上非常有效(其中1和2和3为ActivityFragments).

但是,当我使用此代码时:

    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.leftPaneR.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.在添加新的片段之前,初始片段没有被销毁(?)(在我看来,这意味着它还没有被 …

android android-fragments android-nested-fragment

145
推荐指数
4
解决办法
14万
查看次数

为什么我的android活动总是开始滚动到底部?

每当我开始这项活动时,它总是从最低点开始 - 一直向下滚动到底部.我没有在活动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)

layout android

87
推荐指数
2
解决办法
4万
查看次数

捕获在Android上运行的本机代码引发的异常

我正在进行的项目要求我编写跨平台程序实现的android部分.

构建了一组核心功能,并将其包含在我的应用程序中android-ndk.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:

  • 发生堆栈跟踪/内存转储并将其写入日志文件.该程序消失(设备上没有指示为什么突然该应用程序不再存在).
  • 没有给出堆栈跟踪/转储或其他指示本机代码已崩溃.该程序消失了.
  • java代码崩溃了NullPointerException(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.

我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.

有人可以帮我解决如何应对崩溃本机代码的情况吗?

java-native-interface android exception-handling nullpointerexception android-ndk

51
推荐指数
2
解决办法
3万
查看次数

将JNI类型转换为本机类型

虽然有关于把一个文件jstring到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)我找不到这将转换为一个例子jboolean,以一个booljint一个int.

谁能建议如何实现这一目标?

java-native-interface android-ndk

48
推荐指数
2
解决办法
5万
查看次数

创建每个键具有多个/备用字符的SoftKeyboard

我已经关注了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:移动键预览问题,因为它稍微偏离主题:

如何禁用SoftKeyboard键预览窗口?

android soft-keyboard android-softkeyboard

44
推荐指数
5
解决办法
2万
查看次数

如何在自定义视图中获取"android:"标记值

似乎有很多"类似"的问题和答案分散在其中,所有问题都涉及如何从中获取自定义属性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.

当然这不是一件罕见的事情吗?

android android-custom-view android-layout

42
推荐指数
1
解决办法
2万
查看次数

如何在放大时找到点击的绝对位置

请参阅下面的每个部分,以三种不同的方式描述我的问题.希望能帮助人们回答.

问题:在给定原始比例点和比例因子的情况下,如果只有以缩放图像表示的坐标,如何在画布/用户空间中找到一对坐标?

实践中的问题:

我目前正在尝试复制应用程序中使用的缩放功能,例如图库/地图,当您可以缩放缩放/缩小时缩放移向夹点的中点.

在向下我保存缩放的中心点(基于当前屏幕的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)

math android zooming

29
推荐指数
1
解决办法
1万
查看次数

android:windowSoftInputMode ="adjustResize"没有任何区别?

我有一个使用这种布局的虚假对话框:

<?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)

android android-keypad android-layout android-input-method

28
推荐指数
2
解决办法
4万
查看次数

使用HttpClient时在活动中使用Cookie

我正在尝试一个简单的应用程序来阅读网站的HTML,并转换它以在Android中创建一个易于阅读的UI(这是一个学习android的exersize,而不是一个可用的应用程序).我遇到的问题是跨活动持久存在用户会话,然后在HttpClient一次召回时使用会话.

我想"正确地"这样做,推荐的方法似乎是使用CookieManager.然而,我遇到了这方面的问题 - 我似乎无法找到"正确"的方式来Cookie从一个单独的活动中CookieManager稍后实例化中使用它HttpClient.

当使用CookieManager我可以保存CookieCookie随后在其他活动(见代码段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)

java cookies android httpclient

26
推荐指数
2
解决办法
4万
查看次数