小编NSo*_*uth的帖子

设置launchMode ="singleTask"vs设置活动launchMode ="singleTop"

我有一个非常分层的应用程序(活动类似于League> Team> Position> Player)所以我已经完成了每个活动singleTop,以保持导航合理并防止重复实例.

现在我正在制作我的第二个应用程序,我已经看到它建议声明我的应用程序是singleTask为了防止重复的实例.有人可以帮助解释每种方法的优点吗?

我的新应用程序只是一个包含3个片段的活动,然后我可能会添加一个设置活动,也许还有一个FAQ.

编辑:我刚刚意识到这singleTask并没有像我想象的那样阻止我的应用程序的重复实例.现在正在寻找处理这个问题的正确方法......

android android-manifest android-activity android-navigation

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

如何使给定颜色变暗(int)

我有一个采用给定颜色的功能,我希望它能使颜色变暗(将亮度降低20%左右).给出一个颜色(int),我无法弄清楚如何做到这一点.什么是正确的方法?

public static int returnDarkerColor(int color){
    int darkerColor = .... 
    return darkerColor;
}
Run Code Online (Sandbox Code Playgroud)

android android-color

19
推荐指数
6
解决办法
8603
查看次数

有关在SQLite数据库中使用Android备份服务的问题

我的应用程序将所有用户数据和首选项存储在SQLite数据库中,如果用户获得新手机,重新安装或恢复出厂设置,我希望将其保留.我已经在Android的数据备份指南和他们的Android备份服务中做了一些阅读,但在我开始之前仍然有一些问题.

  1. 是在安装期间还是在我的应用程序首次启动时恢复数据?即,在调用主Activity的代码之前文件是否存在?
  2. 如果我的SQLiteOpenHelper类已经处理升级,那么我还需要做些什么来处理旧数据库的恢复吗?我假设没有,如果在我的应用程序启动之前存在数据库.
  3. 备份时是否会遇到并发问题,因为BackupManager需要时间?如果用户输入新数据并且我调用dataChanged()然后在BackupManager调用之前再次发生相同的事情onBackup(),那么这些数据更改将如何处理?BackupManager是否只备份最新版本的数据库(应该包括两个更改)?
  4. 尝试备份/恢复SQLite数据库会遇到什么问题?我见过开发人员说一台设备上的数据库可能与另一台设备上的数据库不兼容.我想简单地使用备份数据库FileBackupHelper,因为它看起来很简单.至少有一个开发人员似乎通过禁用Write Ahead Logging解决了至少一些兼容性问题.如果我采用这种方法,我可以期待什么样的失败率?如果非常高,我可能会考虑转换为CSV文件并在此过程中返回.
  5. 如果还原失败,我可以捕获它,通知用户,并将麻烦的数据副本保存到存储中吗? 用于故障排除和通知用户.
  6. 备份操作"不是线程安全的".澄清如何处理. Android说,

要确保备份代理不会在活动的同时读取或写入文件,每次执行读取或写入时都必须使用synchronized语句.

  • 这是否意味着我必须在synchronized语句中对每个数据库进行读/写操作?即,我必须将此添加到我的活动从数据库加载或写入信息的每个地方?那是很多地方.
  • 或者它是否只表示备份代码必须使用synchronized

谢谢您的帮助.我只是想做到这一点,让我的用户在今年圣诞节获得新手机时感到高兴!

database sqlite android android-file android-backup-service

12
推荐指数
1
解决办法
509
查看次数

ProGuard构建失败"未解析的引用"

我一直在研究我的应用程序的最新版本,它测试得很好,但是当我发布ProGuard版本时,我会收到许多错误,主要是因为无法找到org.apache.http.*,我在项目中没有使用.我在整个项目中搜索了该文本但找不到它.我添加了一些依赖项,但没有我认为会使用HTTP.

我如何弄清楚为什么 ProGuard会抱怨并妥善解决?它说我可以用"--stacktrace选项"运行,但我无法弄清楚如何做到这一点.

我感谢任何帮助,因为我发现ProGuard常常令人困惑.

构建输出:

Warning: com.google.android.gms.internal.zzw$zza: can't find superclass or interface org.apache.http.client.methods.HttpEntityEnclosingRequestBase
Warning: com.google.android.gms.analytics.internal.zzam: can't find referenced class org.apache.http.NameValuePair
Warning: com.google.android.gms.analytics.internal.zzam: can't find referenced class org.apache.http.client.utils.URLEncodedUtils
Warning: com.google.android.gms.analytics.internal.zzam: can't find referenced class org.apache.http.client.utils.URLEncodedUtils
Warning: com.google.android.gms.analytics.internal.zzam: can't find referenced class org.apache.http.NameValuePair
Warning: com.google.android.gms.analytics.internal.zzam: can't find referenced class org.apache.http.NameValuePair
Warning: com.google.android.gms.analytics.internal.zzj: can't find referenced class org.apache.http.NameValuePair
Warning: com.google.android.gms.analytics.internal.zzj: can't find referenced class org.apache.http.client.utils.URLEncodedUtils
Warning: com.google.android.gms.analytics.internal.zzj: can't find referenced class org.apache.http.client.utils.URLEncodedUtils
Warning: com.google.android.gms.analytics.internal.zzj: can't find referenced class …
Run Code Online (Sandbox Code Playgroud)

android proguard android-build android-proguard

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

解散API 23中的Dialog时出现DeadObjectException

我刚刚将我的项目升级到API 23,并且我在以前一直有效的代码上遇到错误.当我dialog.dismiss()在下面调用Spinner监听器时发生崩溃.如果我不打电话dismiss在这个区域,它不会崩溃.

void showWeekViewOptionsDialog() {
    AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
    final View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_weekview_options, null);

    final MaterialSpinnerCallsSameItemSelected spinner = (MaterialSpinnerCallsSameItemSelected) view.findViewById(R.id.spinner_weekview_days);
    ArrayAdapter<Integer> dayListAdapter;

    ArrayList<Integer> dayList = new ArrayList<Integer>();
    dayList.add(2);
    dayList.add(3);

    dayListAdapter = new ArrayAdapter<Integer>(getActivity(), R.layout.my_spinner_item, dayList);
    dayListAdapter.setDropDownViewResource(R.layout.my_spinner_dropdown_item);
    spinner.setAdapter(dayListAdapter);

    spinner.setSelection(dayListAdapter.getPosition(mWeekViewType));

    b.setView(view);
    final AlertDialog dialog = b.create();
    spinner.setOnItemSelectedEvenIfUnchangedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            dialog.dismiss();  // crashes here!
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {
        }
    });
    dialog.show();
} …
Run Code Online (Sandbox Code Playgroud)

android android-dialogfragment android-6.0-marshmallow

10
推荐指数
1
解决办法
6727
查看次数

SecureNandom提供程序"Crypto"在Android N中不可用,用于确定性地生成密钥

用户可以购买我的应用程序的"专业版".当他们这样做时,我按如下方式存储和验证他们的购买.

  • 合并用户的UUID和另一个唯一字符串.
  • 然后使用静态种子加密生成的字符串.我这样做SecureRandom.getInstance("SHA1PRNG", "Crypto")- 这就是问题!
  • 然后,生成的加密字符串是"解锁代码".
  • 因此,我总是知道用户期望的唯一解锁代码值.
  • 当用户购买"Pro"时,我将"解锁代码"存储在数据库中.
  • 我通过查看数据库中存储的"解锁代码"是否与基于其唯一信息的预期代码匹配来检查用户是否具有"Pro" .

所以,不是最好的系统,但是对于我的简陋应用程序来说,所有内容都是模糊不清的.

问题是SecureRandom.getInstance("SHA1PRNG", "Crypto")在N 上失败,因为不支持"加密".我了解到依赖于特定的提供程序是不好的做法,并且N不支持加密.哎呀.

所以我遇到了一个问题:我依赖于值种子对的加密来始终具有相同的输出.Android N不支持我使用的加密提供程序,因此我不知道如何确保N上的加密输出与其他设备上的加密输出相同.

我的问题:

  1. 是否可以在我的APK中加入"加密"以便它始终可用?
  2. 加密Android N上的值种子对时,我可以确保相同的输出吗?

我的代码:

public static String encrypt(String seed, String cleartext) throws Exception {
    byte[] rawKey = getRawKey(seed.getBytes(), seed);
    byte[] result = encrypt(rawKey, cleartext.getBytes());
    return toHex(result); // "unlock code" which must always be the same for the same seed and clearText accross android versions
}

private static byte[] getRawKey(byte[] seed, …
Run Code Online (Sandbox Code Playgroud)

random android cryptography secure-random android-7.0-nougat

8
推荐指数
2
解决办法
6580
查看次数

如何在TabLayout中获取Tab的视图?

我想在TabLayout中找到Tab的视图,以便我可以将它传递给另一个函数.我不确定如何找到视图. myTabLayout.getTabAt(0).getCustomView()返回null.

我如何获得视图?

TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout_main);
tabLayout.addTab(tabLayout.newTab().setText("Page1"));
tabLayout.addTab(tabLayout.newTab().setText("Page2"));

viewPager = (ViewPager) rootView.findViewById(R.id.pager_main);
pagerAdapter = new MyPagerAdapter(getActivity(), getChildFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(pagerAdapter);
Run Code Online (Sandbox Code Playgroud)

android android-layout android-tabs android-tablayout

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

从选项卡式片段导航时,如何避免聚焦最后一个EditText?

我在ViewPager中有3个选项卡.默认情况下,选项卡2中的焦点位于第一个EditText中.当我从Tab 2导航到Tab 3并返回时,我发现焦点位于Tab 2 的最后一个 EditText中.如果我然后转到Tab 1然后返回,焦点将回到第一个EditText中.因此,当我向右"导航"时,焦点将转移到我所在片段的最后一个EditText.我不想要这个.我想把焦点放在我离开的地方或默认的位置.

此外,我不想简单地在返回时将焦点带回第一个EditText,因为它会在第一个位置向上滚动我的页面的最后一个EditText.我希望它在我的EditText中向上滚动焦点.

当我滑动到Tab 3时,有没有办法阻止焦点转到标签2中的最后一个EditText?

android android-layout android-edittext android-viewpager android-navigation

6
推荐指数
1
解决办法
409
查看次数

在ListView(Android)中关注EditTexts的问题

我有一个ListView,每个项目都有一些EditTexts.我对硬件键盘没有任何问题,但软键盘让人感觉不舒服.我有两个问题.

  1. 当我第一次点击EditText时,它会短暂地出现焦点,但一旦键盘显示就会失去焦点.然后,我必须再次单击EditText以获得焦点.
  2. 当焦点的EditText滚动到视图外时,焦点转到......嗯...请参阅屏幕截图.我不确定发生了什么.

关于#1的更多细节:

  • 屏幕首次加载时,焦点位于"Gr High School Scale"字段,但键盘未显示.
  • 如果我立即点击所需的EditText,它会OnFocusChangeListener告诉我它会获得焦点然后失去焦点.在视觉上,我看到光标出现在字段中,但是当键盘加载时光标跳开(如截图中所示)并且我不知道焦点在哪里.

我已经玩了一下ListView的Focusable和DescendantFocusability属性,但无济于事.有什么建议?

每次有焦点的EditText滚动到视图外时,会显示另一个醉酒光标: 在此输入图像描述

更新:相关代码.
使用ListView XML的活动布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.NsouthProductions.gradetrackerpro"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.NsouthProductions.gradetrackerpro.Activity_EditCourseGPA" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="34dp"
    android:text="Define the GPA and Percent scale for this course." />

<RadioGroup
    android:id="@+id/radioGroup1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView1"
    android:layout_marginLeft="5dp" >

    <LinearLayout
        android:id="@+id/linlay_rad_group_existing_scale"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <RadioButton
            android:id="@+id/radio0_existing_scale"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:checked="true"
            android:text="Existing Scale" />

        <Spinner
            android:id="@+id/spinner_existing_scales"
            android:layout_width="wrap_content"
            android:layout_height="33dp"
            android:layout_gravity="right"
            android:layout_weight="1" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linlay_rad_group_new_scale"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android listview android-layout android-listview android-edittext

6
推荐指数
1
解决办法
6902
查看次数

我应该如何在Android中使用/不使用弃用的方法

我没有问这个问题就太久了.我在Android中遇到过很多方法,这些方法已被弃用,但仍适用于较新版本的API.那么只要它有效,使用弃用方法的风险是什么?

这是一个更具体的问题.我正在使用TimePickers,并且在API 23中不推荐使用getCurrentHour()方法,并将其替换为getHour().我显然不能完全使用getHour(),因为大多数设备尚未在API 23上使用,但是getCurrentHour()对于最新版本的Android 使用"错误"?我应该做以下哪项?

  1. 继续使用getCurrentHour()直到几年过去,API 23成为我的新品minSdkVersion
  2. 在代码中,明确检查API版本并根据结果调用getCurrentHour()或调用getHour()

谢谢你帮我学习.

android deprecated android-version android-timepicker deprecation-warning

6
推荐指数
1
解决办法
968
查看次数