小编Kau*_*pal的帖子

Android 4.4 KitKat上的TextView中无法正确显示自定义ttf字体

我有一些文字有一些粗体部分.直到KitKat这个策略(如本文所述)运作得非常好

我的字符串资源文件:

<string name="multi_style_text">NON-BOLD TEXT \n<b>BOLD</b></string>
Run Code Online (Sandbox Code Playgroud)

我的应用程序代码片段:

txtView.setTypeface(FontUtils.getOstrichRegular(this.getActivity()));
...
public static Typeface getOstrichRegular(Context context) {
   return Typeface.createFromAsset(context.getAssets(),
                                "fonts/ostrich_regular.ttf");
}
Run Code Online (Sandbox Code Playgroud)

目前(在KitKat中),粗体部分未显示在自定义字体中,非粗体部分显示在自定义字体中.在以前的Android版本中,所有文本都以自定义字体显示.

是什么赋予了?

fonts android types textview android-fonts

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

将Observable收集到List中似乎不会立即发出集合

我正在使用RxJava来实质上收集单独发出的Observable列表,并将它们组合成一个Observable列表(基本上与flatMap相反).这是我的代码:

        // myEvent.findMemberships() returns an Observable<List<Membership>>

        myEvent.findMemberships()
             .flatMap(new Func1<List<Membership>, Observable<User>>() {
               @Override
               public Observable<User> call(List<Membership> memberships) {
                 List<User> users = new ArrayList<User>();
                 for (Membership membership : memberships) {
                   users.add(membership.getUser());
                 }
                 return Observable.from(users);
               }
             })
             .toList()
             .subscribeOn(Schedulers.newThread())
             .observeOn(AndroidSchedulers.mainThread())
             .subscribe(new Observer<List<User>>() {
               @Override
               public void onCompleted() { }

               @Override
               public void onError(Throwable e) {
                 Timber.e(e, "Error when trying to get memberships");
               }

               @Override
               public void onNext(List<User> users) {
                 Timber.d("%d users emitted", users.size());
               }
             })
Run Code Online (Sandbox Code Playgroud)

我注意到我的onNext永远不会被调用.我似乎无法理解这一点.如果我删除.toList调用并基本输出各个用户(如下所示),它通过发出每个项目来工作.

subscriptions //
    .add(currentEvent.findMemberships()
             .flatMap(new Func1<List<Membership>, Observable<User>>() { …
Run Code Online (Sandbox Code Playgroud)

java frp rx-java

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

禁用箭头键导航

jQuery UI选项卡具有此"功能",如果我按向上/向左或向下/向右键箭头,它会切换选项卡并加载该选项卡.

通常对于水平制表符,用户更熟悉使用向上和向下键滚动页面与移动制表符.是否可以仅为向上和向下键禁用选项卡导航?

UPDATE

根据康斯坦丁的建议,我尝试了以下代码.单击锚点选项卡后,单击向上或向下键时,它会阻止事件.如果我按下左/右键的另一个键,然后再次按下向上/向下键.它注册事件,但似乎没有停止传播.该事件可以从另一个元素开火吗?这是我的代码:

   $('#tabs').keydown(function (event) {
        console.log("in tabs");
        if (event.keyCode == 40 || event.keyCode == 38) {
          event.stopPropagation();
          event.preventDefault();
          return false;
        };
    });
    $('.ui-tabs-anchor').keydown(function (event) {
      console.log("in ui tabs anchor");
        if (event.keyCode == 40 || event.keyCode == 38) {
          event.stopPropagation();
          event.preventDefault();
          return false;
        };
    });

    $('.ui-tabs-nav').keydown(function (event) {
      console.log("in ui tabs nav");
        if (event.keyCode == 40 || event.keyCode == 38) {
          event.stopPropagation();
          event.preventDefault();
          return false;
        };
    });
Run Code Online (Sandbox Code Playgroud)

jquery-ui jquery-ui-tabs

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

规范的方法是启动多个嵌套活动并获得结果onActivityResult

我有以下要求:

活动A --->活动B --->打开图库应用程序

传统上,我使用TaskStackBuilder启动嵌套活动.所以我会做这样的事情:

                TaskStackBuilder tsb = TaskStackBuilder.create(this);
                Intent activityIntentA = new Intent(this, ActivityA.class) // ...
                tsb.addNextIntent(activityIntentA);

                Intent activityIntentB = new Intent(this, ActivityB.class) // ...
                tsb.addNextIntent(activityIntentB);

                Intent galleryIntent = new Intent(Intent.ACTION_PICK);
                galleryIntent.setType("image/*");
                tsb.addNextIntent(galleryIntent);

                // this.startActivities(new Intent[] {activityIntentA, activityIntentB, galleryIntent});
                tsb.startActivities();
Run Code Online (Sandbox Code Playgroud)

(一个问题是,如果使用任务堆栈构建器或startActivities()调用之间存在差异).

但是这种方法的问题是,当galleryIntent关闭时,它不会调用onActivityResult而是调用OnCreateActivityB 的方法,这意味着我将丢失来自gallery app的信息,该信息是通过intent param"data"提供的. "在我的onActivityResult调用activityB上.

另一种解决方案是手动启动调用,因此首先调用Activity B,然后使用flag/param/argument,启动galleryIntent,然后按照常规流程执行OnActivityResult.

有没有更好的方法来解决这个要求?

android

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

从gradle运行单个Android(单元)测试,而不加载其他项目依赖项

我正在使用Jake Wharton精彩插件进行Android单元测试.我努力让这些单元测试运行的目的是为了速度(TDD快速反馈和所有).

我已经设法正确配置它并运行一些示例测试,如下所示:

./gradlew test
Run Code Online (Sandbox Code Playgroud)

每当我运行测试时,我会注意到以下输出:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0
The Test.testReportDir property has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the Test.getReports().getHtml().getDestination() property instead.
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.
:mySampleApp:preBuild UP-TO-DATE
:mySampleApp:preDebugBuild UP-TO-DATE
:mySampleApp:preReleaseBuild …
Run Code Online (Sandbox Code Playgroud)

junit android unit-testing gradle robolectric

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

使用Espresso如何检查警报对话框中的项目数

我有一个显示许多项目的警告对话框.

    private String[] choices; // populated externally

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setItems(choices, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            _callback.onChoiceSelected(which);
            dialog.dismiss();
        }
    });

    _dialog = builder.create();
Run Code Online (Sandbox Code Playgroud)

在不同的情况下(例如,如果您是管理员/客人),您将拥有不同数量的"选择".在我的espresso测试中,我基本上试图测试存在的项目数量.

public void test_ViewsSetupCorrectly() {

    onView(withId(R.id.settings)).perform(click());
    onView(ViewMatchers.withChild(withClassName(Matchers.equalToIgnoringCase("TextView")))).check(matches(isDisplayed()));

    /*// What I would ideally like ... but doesn't work as well :( :
      onView(withClassName(equalToIgnoringWhiteSpace("DialogTitle"))).check(matches(hasProperty("child-count",
                                                                                                      is(new Integer(1))
                                                                                                      )));*/
}
Run Code Online (Sandbox Code Playgroud)

这些基本上抛出一个异常,如下:

我认为onData调用仅用于执行操作?我不是必须采取行动.谁能帮我实际测试一下?

  com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: has child: with class name: eqIgnoringCase("TextView")
  If the target view is not part of …
Run Code Online (Sandbox Code Playgroud)

android hamcrest android-testing android-espresso

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

RxJava中对缓冲区的理解不正确

我正在努力熟悉RxJava.这是我想要实现的用例:

我的屏幕上有一个按钮,我正在尝试收集水龙头的数量.因此,如果用户点击按钮,则会注册单击并生成日志.现在,如果用户单击按钮两次,则它会记录两次点击,收集它们并输出2而不是1.

基本上,我试图在一段时间内累积点击次数,然后吐出最终结果.我猜" 缓冲 "是我需要使用的方法.我在Android中编写了一个快速示例(代码如下),但缓冲方法似乎并不像收集所有事件输入和吐出集合那么简单.

public class DemoFragment
    extends Fragment {

    private int _tapCount = 0;
    private Observable<List<Integer>> _bufferedObservable;
    private Observer<List<Integer>> _observer;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        _setupLogger();

        _bufferedObservable = _getBufferedObservable();
        _observer = _getObserver();
    }


    // the library butterknife allows this
    @OnClick(R.id.btn_start_operation)
    public void onButtonTapped() {
        _log("GOT A TAP");
        _bufferedObservable.subscribeOn(Schedulers.io())
                         .observeOn(AndroidSchedulers.mainThread())
                         .subscribe(_observer);
    }

    private Observable<List<Integer>> _getBufferedObservable() {
        return Observable.create(new Observable.OnSubscribe<Integer>() {


            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);   // send one tap here
            }

        }).buffer(2, …
Run Code Online (Sandbox Code Playgroud)

java android frp rx-java

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

订阅者在使用Otto时不会被解雇

我在Android上尝试使用Otto,我试图将我的片段中的消息发送回活动.这是我的代码的基础知识:

我的巴士供应商:

public final class BusProvider {

 private static final Bus mInstance = new Bus();

 private BusProvider() {}

 public static Bus getBusProviderInstance() {
     return mInstance;
 }
}
Run Code Online (Sandbox Code Playgroud)

我的活动有以下代码:

public class MyActivity
        extends BaseActivity {

    // ....

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        BusProvider.getBusProviderInstance().register(this);
        // ....
    }

    @OnClick(R.id.profile_image)
    public void onImageClicked() {

        // ...

        MyFragment fragment = MyFragment.newInstance(choices);
        fragment.show(getFragmentManager(), "myChoices");
    }

    @Subscribe
    public void onButtonChoicePicked(MyFragment.ChoicePickedEvent event) {
        Toast.makeText(this, "reaching here", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStop() {
        super.onStop();
        BusProvider.getBusProviderInstance().unregister(this);
    } …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments otto butterknife

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

控制在TextWatcher for Android中触发事件

我不得不使用EditTexts重新创建AutoCompleteTextViews的功能(出于不同的原因*,这可能是另一个问题,但我现在正走这条路).

每当EditText上的Text发生更改时,我都会通过发出api调用来完成所有功能.我通过使用TextWatcher(覆盖afterTextChanged方法)来完成此操作.

有没有办法可以控制,监听器触发调用的方式?

这是我的用例:

我正在寻找加州.

我查了一下.长度为3然后开始发射呼叫.所以当前发送的API调用数= 8

  1. 卡尔
  2. 卡利
  3. 加利福尼亚州
  4. Califor
  5. Californ
  6. 加利福尼亚州
  7. 加州

如果我收到新的文字更改,有没有办法取消已解雇的活动?因此,当用户键入加利福尼亚时,我会等到没有输入新文本的间隙,然后激活对我的API的调用?

它不一定非常准确.这里和那里的额外事件是完全可以接受的.我希望将从8点发射的事件数量减少到至少3点.

我想在不同的列表视图中显示自动完成结果,而不是自动完成文本视图旁边的弹出窗口.

java android event-handling textwatcher

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

可以通过Java中的反射创建具有增量variableNames的可变数量的变量吗?

嗨,我有以下要求.

我想根据存在的级别数在方法中创建可变数量的String数组.例如

我有一个从jsp页面收到的变量numOfLevels(int).

基于此,我想创建:

String[] level1;
String[] level2;
String[] level3;
String[] level4;
Run Code Online (Sandbox Code Playgroud)

等......

我知道我的要求可以用Hashmaps处理,我最终还是采取了这样做,但我很好奇如何用Java中的反射实现这一点.

提前谢谢了.


嗯像一位评论者指出的那样,在那里有一个几乎相似的问题是在那里用Java动态生成Variables的名字吗?

感谢人们的宝贵投入!

java arrays reflection

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