小编Rus*_*art的帖子

Android中任何简单,通用的方式来获取布局的根视图?

我想知道Android Activity类中是否有通用方法允许您获取该Activity的布局的根视图.我知道我可以这样做:

View v = findViewById(R.id.root_view_id)
Run Code Online (Sandbox Code Playgroud)

但是我希望能够在不必传入根视图的ID的情况下完成它.我需要为很多不同的活动做这个,如果我有一个通用的方法调用来完成任务会更方便.

android android-layout

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

Genymotion模拟器在Kubuntu 13.10 64位上给出Open GL错误

我一直在Kubuntu上使用Genymotion Android模拟器,但最近我遇到了阻止它工作的Open GL错误.有趣的是,我有一个较旧的Galaxy Nexus 4.2.2模拟器图像工作正常(虽然它抱怨我启动时版本不匹配),但如果我尝试创建任何较新的图像,模拟器无法启动.当我检查logcat时,我看到以下错误:

I/SurfaceFlinger(  459): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...
D/libEGL  (  459): loaded /system/lib/egl/libEGL_emulation.so
D/        (  459): HostConnection::get() New Host Connection established 0xb890b898, tid 460
D/libEGL  (  459): loaded /system/lib/egl/libGLESv1_CM_emulation.so
D/libEGL  (  459): loaded /system/lib/egl/libGLESv2_emulation.so
E/setdpi  (  463): Setting DPI to 213
E/SurfaceFlinger(  459): hwcomposer module not found
W/SurfaceFlinger(  459): getting VSYNC period from fb HAL: 16666666
W/SurfaceFlinger(  459): no suitable EGLConfig found, trying without EGL_FRAMEBUFFER_TARGET_ANDROID
W/SurfaceFlinger(  459): no suitable EGLConfig found, trying …
Run Code Online (Sandbox Code Playgroud)

ubuntu android opengl-es android-emulator genymotion

27
推荐指数
1
解决办法
2482
查看次数

每次添加/删除自定义类型的帐户时,为什么Android会触发Google帐户同步?

我有一个与使用AccountManager和Sync的Web服务相关联的应用,允许用户通过应用登录到他们的帐户并同步他们的数据(这是自定义数据,而不是Google帐户使用的联系人或其他任何内容).AFAIK,我正按照我应该的方式做所有事情.当用户通过我们的API登录时,我将他们的帐户保存到Android AccountManager:

AccountManager am = AccountManager.get(context);
m.addAccountExplicitly(new Account(username, ACCOUNT_TYPE), account_id, user_data);
Run Code Online (Sandbox Code Playgroud)

我已将ACCOUNT_TYPE定义为应用程序的包名称,这应足以将其与任何其他帐户类型区分开来.

添加帐户后,我会将其设置为自动同步:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), SYNC_FREQUENCY_SECONDS);
Run Code Online (Sandbox Code Playgroud)

我已将SYNC_FREQUENCY_SECONDS定义为86400(即1天).

同样,如果用户注销,我只需从AccountManager中检索他们的帐户并调用removeAccount()将其删除.很好,很简单.

同步是通过我自己的代码执行的,因为它是正在同步的所有自定义数据,并且一切正常.然而,令我发疯的是,无论何时我使用此代码添加或删除帐户(我自己的类型),它都会立即触发设备上所有Google帐户的同步.这意味着,在同步我的数据之前,首先必须同步所有电子邮件,日历数据,联系人,Google Play杂志,Google+数据和图片等等.这可能需要几分钟,在此期间我的应用只是耐心等待轮到同步数据.这非常令人沮丧,我的用户很难理解为什么一旦他们登录就需要这么长时间来同步他们的数据(更不用说当它同步那么多数据时,手机有慢慢的趋势)几乎到了无反应的程度).

我在这里做错了吗?我的代码中是否存在无意中告诉Android的内容,"嘿,现在就去同步所有Google数据!"?或者,它是Google必须忍受的Google帐户/同步框架中固有的东西?

android sync accountmanager

14
推荐指数
1
解决办法
994
查看次数

使用setTextColor()以编程方式设置Android TextView文本颜色会使android:duplicateParentState无效

我有简单文本项的列表视图.这些项目中的TextView看起来像这样(它包含在一个内部RelativeLayout):

<TextView
  android:id="@+id/text_language_name"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentLeft="true"
  android:layout_centerVertical="true"
  android:duplicateParentState="true"
  android:textSize="16sp"
  android:textStyle="bold" />
Run Code Online (Sandbox Code Playgroud)

我想为文本使用以下颜色状态选择器,我称之为"dark_list_text_states.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:color="@android:color/white"/>
    <item android:color="@color/dark_list_text"/>

</selector>
Run Code Online (Sandbox Code Playgroud)

通常,当然,我可以将其设置android:textColor为xml中的属性,但在这种情况下,我需要使用此选择器("blue_text_states.xml")以编程方式将一个特定项设置为不同的颜色:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:color="@android:color/white"/>
    <item android:color="@color/selected_blue"/>

</selector>
Run Code Online (Sandbox Code Playgroud)

所以我在适配器中设置文本颜色(language_nameselected在代码中先前定义):

        TextView text_language_name = (TextView)view.findViewById(R.id.text_language_name);
        if (text_language_name != null) {
            text_language_name.setText(language_name);
            int text_color = selected
                           ? getResources().getColor(R.color.blue_text_states)
                           : getResources().getColor(R.color.dark_list_text_states);
            text_language_name.setTextColor(text_color);
            text_language_name.setDuplicateParentStateEnabled(true);
        }
Run Code Online (Sandbox Code Playgroud)

除了一个问题外,这个工作正常:单击项目时文本颜色不会改变.即使我立即调用setDuplicateParentStateEnabled(true)该项目setTextColor(),该设置也完全被忽略.

我通过注释掉设置文本颜色的Java代码并在xml中设置它来测试这个,并且选择器工作得很好.但是如果我以编程方式设置textColor,它完全无法复制父状态.

谁看过这个吗?有没有解决方法,或者这只是我必须忍受的Android错误?

android textcolor textview

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

使用 slack 命令作为多个命令的快捷方式

我的公司最近改用 Slack,到目前为止我真的很享受。我正在学习 Slack 自定义命令,我想尝试编写一些。

我的第一个想法是创建一条离开的捷径——无论是午餐,还是短暂的休息。当我去吃午饭时,我使用/away命令将我的状态设置为“离开” ,并使用/dnd 1 hour. 如果我可以创建一个自定义的 Slack 命令,/lunch它会执行这两项操作,而另一个称为/back切换回 Online 而不是 Snoozed 的命令,那就太好了。

自定义命令的所有文档都面向与外部 API 的接口,但是有没有办法编写自定义命令来触发 Slack 本身的操作?这是否需要使用 Slack API?

slack-api

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

无法让Android DatePickerDialog切换到Spinner模式

我正在构建一个使用DatePickerDialog的应用程序,允许用户选择他们的生日.这是现在加载对话框的代码:

private void selectBirthdate() {
    int year, month, day;
    if (mBirthDate == null) {
        year = DEF_YEAR;
        month = DEF_MON;
        day = DEF_DAY;
    }
    else {
        year = mBirthDate.get(Calendar.YEAR);
        month = mBirthDate.get(Calendar.MONTH);
        day = mBirthDate.get(Calendar.DAY_OF_MONTH);
    }
    new DatePickerDialog(
            getActivity(),
            new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                    mBirthDate = new GregorianCalendar();
                    mBirthDate.set(Calendar.YEAR, year);
                    mBirthDate.set(Calendar.MONTH, month);
                    mBirthDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                    if (mTxtBirthDate != null) {
                        mTxtBirthDate.setText(mBirthDateFormat.format(mBirthDate.getTime()));
                    }
                }
            },
            year,
            month,
            day
    ).show();
}
Run Code Online (Sandbox Code Playgroud)

这是我加载对话框时的样子: 原始对话

但是,他们希望能够使用旧式微调器DatePicker,因为在新的日历视图中,用户并不总是可以更改年份.所以我一直在研究这个主题,根据我读过的内容,应该可以使用主题强制DatePickerDialog进入Spinner模式.所以这就是我所做的. …

android android-datepicker android-alertdialog android-styles

6
推荐指数
2
解决办法
3833
查看次数

即使在操作系统中禁用了屏幕旋转,我的Android应用也会旋转.我怎样才能解决这个问题?

我正在开发一款完全支持横向模式的Android应用.我的所有活动都在清单中设置了以下属性:

android:configChanges="keyboardHidden|locale|orientation"
android:screenOrientation="sensor"
Run Code Online (Sandbox Code Playgroud)

但是,如果我在手机的屏幕设置中禁用旋转,我的应用程序仍会在手机旋转时旋转.这种困扰我; 似乎系统级设置的全部意义如果它可以被单个应用程序覆盖是没有意义的.我如何解决这个问题,以便在手机上启用屏幕旋转的情况下仍能正常运行时遵循系统级设置?

android orientation screen-orientation orientation-changes android-orientation

4
推荐指数
1
解决办法
3713
查看次数

适用于Android的Firebase Admin SDK,找不到方法

我正在构建一个由Firebase应用支持的Android应用,我希望能够创建一个可以编辑或删除其他用户帐户的管理员帐户.如果我理解正确,Firebase Admin SDK应该允许我这样做.所以我按照这里的说明操作.

在我的应用中设置Admin SDK.我在build.app中添加了以下内容:

compile 'com.google.firebase:firebase-admin:4.1.1'
Run Code Online (Sandbox Code Playgroud)

在我的Application类中,我添加了这个:

FileInputStream serviceAccount = null;
try {
    serviceAccount = new FileInputStream("app/<MY-DATABASE>.json");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

if (serviceAccount != null) {
    FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
            .setDatabaseUrl("https://<MY-APP>.firebaseio.com/")
            .build();

    FirebaseApp.initializeApp(options);
}
Run Code Online (Sandbox Code Playgroud)

但是,它告诉我:

  • FirebaseOptions.Builder中没有名为setCredential()的方法
  • FirebaseApp.initializeApp()接受Context对象,而不是FirebaseOptions.

根据文档,FirebaseOptions.Builder.setCredential()是一种新方法,它取代了已弃用的方法FirebaseOptions.Builder.setServiceAccount().但setServiceAccount()也不存在.

这里发生了什么?

android firebase firebase-admin

4
推荐指数
1
解决办法
4496
查看次数

Google Plus GoogleApiClient connect()没有帐户选择对话框

我正在努力将Google+登录集成到应用中,我现在大部分都在使用它.按照这里的说明:

https://developers.google.com/+/mobile/android/sign-in

我可以添加"使用Google登录"按钮,整合GoogleApiClient来自Play服务,并允许用户登录自己选择的Google帐户.

但是,为了遵守Google服务条款,我还希望为他们提供一种方式(在不同的活动中),以完全断开他们的Google+帐户与应用的关联.根据Google的文档:

https://developers.google.com/+/mobile/android/sign-in#revoking_access_tokens_and_disconnecting_the_app

这是一个简单Plus.AccountApi.revokeAccessAndDisconnect()的连接调用问题GoogleApiClient.问题是,这需要我GoogleApiClient首先连接.

获取此类对象的过程在第一个链接中概述:GoogleApiClient.Builder用于构建客户端对象,对其进行调用connect(),并使用适当的回调来检测连接成功或失败.但是,如果用户手机上有多个Google帐户,则会connect()导致立即失败,要求我调用解析意图,这会弹出一个对话框,要求他们选择要使用的帐户.

但这不适用于此案例,因为他们已经登录Google+,因此我应该已经知道要使用哪个帐户.请记住,此时,我需要做的就是创建一个GoogleApiClient登录到之前登录的帐户的对象,然后我可以将其传递给Plus.AccountApi.revokeAccessAndDisconnect().但我不知道该怎么做.

我查看了文档并搜索了我能想到的每一个单词组合来解释这个问题,但到目前为止我一无所获.是否有任何方法可以GoogleApiClient使用特定帐户进行实例化,而不是要求用户从现有帐户列表中进行选择?或者,如果没有,是否有一些信息保存到首选项,我可以访问以获取他们已在我的应用程序中授权的帐户的令牌?

android google-plus

3
推荐指数
1
解决办法
1884
查看次数

org.json.JSONObject构造函数不接受看似有效的JSON字符串

我有一个string在一个Android应用程序,我想转换成一个JSONObject.在string这个样子的(除了时间更长,实际值,而不是我这里输入的虚拟值):

[[{"1":"a"}],[{"1a":"1a","1b":"1b"},{"2a":"2a","2b":"2b"}]]
Run Code Online (Sandbox Code Playgroud)

我已将其精确地输入string到两个在线版中JSON validator,并且它们都确认它是有效的JSON data.所以我假设JSONObject构造函数能够接受这个字符串并将其转换为JSONObject.但是当我尝试:

json = new JSONObject(result);
Run Code Online (Sandbox Code Playgroud)

其中"result"是包含上面列出的字符串的String变量,我得到以下异常:

JSONException: A JSONObject text must begin with '{' at character 1 of [[{"1":"a"}],[{"1a":"1a","1b":"1b"},{"2a":"2a","2b":"2b"}]]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?这个JSONObject解析器坏了吗?

java android json jsonobject android-json

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

Android中的SimpleDateFormat将当前日期定为02/32/2011

今天是2011年2月1日.我正在尝试使用SimpleDateFormat以"MM/DD/yyyy"格式为Android生成日期字符串.这是我的代码:

Date d = new Date();
String date = (new SimpleDateFormat("MM/DD/yyyy")).format(d);
Run Code Online (Sandbox Code Playgroud)

它返回以下字符串:

02/32/2011
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我看不出任何我做错的事.

java android date simpledateformat

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