小编Vla*_*nov的帖子

Android ViewModel调用Activity方法

我正在我的项目中使用android AAC库和Android数据绑定库.我有AuthActivity和AuthViewModel扩展了android的ViewModel类.在某些情况下,我需要让Activity为ViewModel调用一些方法.例如,当用户点击Google Auth或Facebook Auth按钮时,它在Activity类中初始化(因为初始化GoogleApiClient我需要Activity上下文,我无法传递给ViewModel,视图模型无法存储Activity字段).在Activity类中实现了Google Api和Facebook API的所有逻辑:

//google api initialization
googleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

//facebook login button
loginButton.setReadPermissions(Arrays.asList("email", "public_profile"));
loginButton.registerCallback(callbackManager,
Run Code Online (Sandbox Code Playgroud)

此外,我需要调用登录意图,这也需要活动上下文:

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, GOOGLE_AUTH);
Run Code Online (Sandbox Code Playgroud)

我不能请求facebook登录和google登录,或者从视图模型类请求startActivity intent,所以我创建了类接口AuthActivityListener:

public interface AuthActivityListener {
    void requestSignedIn();

    void requestGoogleAuth();

    void requestFacebookAuth();

    void requestShowDialogFragment(int type);
}
Run Code Online (Sandbox Code Playgroud)

在活动类中实现监听器:

AuthActivityRequester authRequestListener = new AuthActivityRequester() {
        @Override
        public void requestSignedIn() {
            Intent intent = new Intent(AuthActivity.this, ScanActivity.class);
            startActivity(intent);
            AuthActivity.this.finish();
        }

        @Override
        public void requestGoogleAuth() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
            startActivityForResult(signInIntent, GOOGLE_AUTH);
        } …
Run Code Online (Sandbox Code Playgroud)

android listener mvvm viewmodel android-activity

11
推荐指数
3
解决办法
2685
查看次数

Redux 使用 jest、nock、axios 和 jsdom 测试多部分/表单数据

我正在使用 jest+nock+jsdom 模块来测试我的 React\Redux 应用程序。我需要测试这个异步操作函数:

export function updateUserPhoto (file, token) {
  const data = new FormData()
  data.append('file', file)

  return dispatch => {
    dispatch(userPutPhotoRequest())
    return axios({
      method: 'PUT',
      headers: {
        'x-access-token': token
      },
      data: data,
      url: API_URL + '/user/photo'
    })
      .then(res => dispatch(userPutPhotoSuccess(res.data)))
      .catch(err => dispatch(userPutPhotoFilure(err)))
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我使用 jsdom 向测试提供 FormData 和 File 对象:

const {JSDOM} = require('jsdom')

const jsdom = (new JSDOM(''))
global.window = jsdom.window
global.document = jsdom.window.document
global.FormData = jsdom.window.FormData
const File = jsdom.window.File
global.File = jsdom.window.File
Run Code Online (Sandbox Code Playgroud)

这是测试“上传照片”功能的方法: …

form-data reactjs jestjs redux axios

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

如何为按钮添加模糊的阴影?

我需要在我的按钮上添加模糊的阴影:

在此输入图像描述

我尝试使用layer-list xml drawable创建背景,但它看起来不像模糊.

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

    <!-- Drop Shadow Stack -->
    <item>
        <shape>
            <corners android:radius="45dp" />
            <padding
                android:bottom="2dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />

            <stroke
                android:width="6dp"
                android:color="#007879E8" />

        </shape>
    </item>
    //////   10 more items
        <item>
        <shape>
            <corners android:radius="45dp" />
            <padding
                android:bottom="2dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />

            <stroke
                android:width="6dp"
                android:color="#177879E8" />


        </shape>
    </item>

    <!-- Background -->
    <item>
        <shape>
            <corners android:radius="45dp" />
            <stroke
                android:width="2dp"
                android:color="@color/main_purple_text_color" />
        </shape>
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

此外,我试图使用背景元素隐藏按钮与blured png但它使用了很多资源,我不能创建选择器来改变悬停或点击背景.

我需要为按钮设置单个背景文件,并使用选择器在悬停/单击时更改模糊和渐变.有任何想法如何用Android SDK实现这样的效果?

更新1

谢谢大家的答案,但我不是在问如何创建渐变.我已经这样做了.我需要创建模糊的阴影.

android gradient blur dropshadow

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

删除 EditText 中的附加下划线

我有带有自定义背景可绘制的 EditText:

在此处输入图片说明

编辑文本代码:

<EditText
    android:id="@+id/etName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@{ViewModel.isAllowEdit  ? @drawable/profile_et_background_active : @drawable/profile_et_background}"
    android:inputType="@{ViewModel.isAllowEdit ? InputType.TYPE_CLASS_TEXT : InputType.TYPE_NULL}"
    android:text="@={ViewModel.name}"
    android:textColor="@color/main_dark_text_color" />
Run Code Online (Sandbox Code Playgroud)

我正在使用 android 数据绑定库和 MVVM 架构。

如果 ViewModel 的 isAllowEdit 设置为 true,则 EditText 背景设置为 @drawable/profile_et_background_active。

如果 isAllowEdit false EditText 将背景设置为@drawable/profile_et_background。

此外,我不允许通过将 inputType 设置为 TYPE_NULL 进行编辑,并通过将 inputType 设置为 TYPE_CLASS_TEXT 来允许进行编辑。

@drawable/profile_et_background_active 代码:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item
        android:left="-2dp"
        android:right="-2dp"
        android:top="-2dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dp"
                android:color="@color/main_elements_line_color" />
        </shape>
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

@drawable/profile_et_background 代码:

<item>
    <shape android:shape="rectangle"> …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-edittext

5
推荐指数
3
解决办法
9179
查看次数

Visual Studio 代码禁用对象解构的代码格式

我正在使用 Koa 和 Typescript 编写网络应用程序。在 vscode 中,我遇到了不需要的代码格式:当我使用对象解析方法声明变量时,vscode 在多行中自动格式化它:

deleteUser: async (ctx: Context) => {
  const {
    body: { userId }
  } = ctx;

  await userService.deleteUser(userId);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我希望它保留在一行中:

deleteUser: async (ctx: Context) => {
  const { body: { userId } } = ctx;

  await userService.deleteUser(userId);
}
Run Code Online (Sandbox Code Playgroud)

我喜欢 vscode 处理我的代码格式的方式,所以我不想禁用它。但我想找到一种解决方法,如果行长度小于 80 个字符,则禁用对象解构格式。

我应该使用什么规则来解决这个问题?我应该更改 vscode 规则还是 tslint 规则?

这是我的 .tslint 文件:

{
  "rules": {
    "class-name": true,
    "comment-format": [true, "check-space"],
    "indent": ["tabs"],
    "one-line": [true, "check-open-brace", "check-whitespace"],
    "no-var-keyword": true,
    "quotemark": [true, "double", "avoid-escape"],
    "semicolon": [true, …
Run Code Online (Sandbox Code Playgroud)

formatting object-destruction typescript tslint visual-studio-code

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