среда, февраля 11, 2015

AnimatonDrawble - handle animation end / обработать окончание анимации


AnimationDrawble после запуска постоянно возвращает true в результате вызова isRunning, что особенно удивляет в случае onShot = true.

Один из вариантов отследить окончание анимации - посчитать перед стартом ожидаемую продолжительность и, через соответствующий интервал времени, отправить сообщение, инициирующее обработку окончания анимации.


After animationDrawbale was started, isRunning method always returns true regardless the onShot value.
On way to handle animation's end is to calculate the total animation's duration and to send an event after that duration is expired.

private AnimationDrawable timerAnimation;

...

private void startTimerAnimation() {
int timerAnimationDuration = calcTimerAnimationDuration();
timerAnimation.start();
timerAnimationEndHandler.sendEmptyMessageDelayed(0, timerAnimationDuration);
}
   

private int calcTimerAnimationDuration() {
    int total = 0;
    for (int i = 0; i < timerAnimation.getNumberOfFrames(); i++) {
        total += timerAnimation.getDuration(i);
    }
    return total;
}


private Handler timerAnimationEndHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
onTimerAnimatonFinished();
};

среда, сентября 24, 2014

Highlight listview's seleted items in ListView.CHOICE_MODE_MULTIPLE_MODAL mode

Add
android:background="?android:attr/activatedBackgroundIndicator"
to the list item's layout.

It is for SDK 11+.

пятница, июня 06, 2014

MS Office 2013 installation error: 12002-4 / Ошибка 12002-4 при установке Office 2013

I've got this error while installing Office 2013.

How I fixed it:
1. run the FixIt tool to uninstall and check config (http://support.microsoft.com/kb/2739501)
2. defragment the disk (wtf?!!). I don't know why, but it works (I have found this recommendation on MS site).

А теперь по-русски.
Итак, при устновке Office 2013 поймал указанную ошибку. 
Как вылечилось:
1. запустил FixIt Tool (http://support.microsoft.com/kb/2739501)
2. выполнил дефрагментацию диска. Я реально не понимаю как она влияет, но такую рекомендацию на шёл на сайте MS. 


пятница, марта 07, 2014

Волшебство родной клавиатуры HTC One: textVisiblePassword и переключение языка

Хм. Это удивительно.

Если для EditText указать android:inputType="textVisiblePassword|textNoSuggestions", то при вводе в это поле при использовании родной клавиатуры HTC One кнопка смены языка остаётся незименной с англ. по дефолту.

Если textVisiblePassword убрать - переключается, но игнорирутеся textNoSuggestions: появляются предлагаемые варианты написания. Особенно удобно при вводе логинов и прочей закрытой информации.
Переключение языка есть,
предлагаются варианты



Переключение языка есть,
предлагаются варианты
(хотя и не должны)
 
Переключение языка отсутствует,
варианты не предлагаются


Переключение языка отсутствует,
варианты не предлагаются






пятница, февраля 21, 2014

How to enable Swype, SwiftKey keyboard on HTC One

To disable the HTC keyboard and to set custom one as default:
1. Go to Settings
2. Select Language & Keyboard
3. Turn Swype ON

Next:
4. From Applications menu disable HTC Sense Input

Now you can use Swype.  

пятница, декабря 06, 2013

ListView, не вызывается OnItemClickListener

Внезапно поймал ситуацию, когда обработчик нажатия на элемент списка не вызывался.
Особенность заключалась в том, что в состав раскладки для элемента списка входит Button.

Проблема заключается в том, что Button по умолчанию является focusable.
Решилось просто: берём Button и говорим ему:

        android:focusable="false"
        android:focusableInTouchMode="false"


вторник, ноября 26, 2013

Eclipse Kepler ADT, не запускается после падения, лечение / Eclipse Kepler does not start after crash

После (очередного) падения Eclipse по причине нехватки памяти он отказался запускаться

Выглядит это так:
1. кликаем на ярлык
2. наблюдаем секунду-две начальный экран
3. всё завершается.

В логе наблюдается следующая симптоматика:
!ENTRY org.eclipse.osgi 4 0 2013-11-26 11:48:30.590
!MESSAGE An error occurred while automatically activating bundle com.android.ide.eclipse.adt (414).
!STACK 0
org.osgi.framework.BundleException: Exception in com.android.ide.eclipse.adt.AdtPlugin.start() of bundle com.android.ide.eclipse.adt.

Запуск с параметром -clean не помог.

Вылечилось гуглом и следующим действием (отсюда):
delete .metadata\.plugins\org.eclipse.e4.workbench file




вторник, сентября 03, 2013

EditText - запрет подсказок при вводе

По идее, для того, чтобы запретить предлагать варианты в процессе ввода символов в EditText, достаточно указать флаг
android:inputType="textNoSuggestions"

Не знаю отчего, но на моём HTC One с клавиатурой от Swype наличие этого параметра не предотвращает от появления подсказок.

Помогло добавление ещё одного флага:
android:inputType="textVisiblePassword|textNoSuggestions"

среда, августа 21, 2013

Простой способ узнать размеры элементов после окончания раскладки

В Android – Using TouchDelegates увидел исключительно простой способ что-то сделать после того, как процесс раскладки компонентов завершён и известны их реальные размеры.


@Override
protected void onCreate(Bundle savedInstanceState) {
...

View content = findViewById(android.R.id.content);
content.post(r);
}

Runnable r = new Runnable() {

@Override
public void run() {
Log.d("TestApp", "width is:" + myView.getWidth());
}
};

понедельник, июня 24, 2013

Использование HierarchyViewer на нерутованных устройствах

В помощь: https://github.com/romainguy/ViewServer

Подключается так:

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set content view, etc.
        ViewServer.get(this).addWindow(this);
    }
      
    public void onDestroy() {
        super.onDestroy();
        ViewServer.get(this).removeWindow(this);
    }
  
    public void onResume() {
        super.onResume();
        ViewServer.get(this).setFocusedWindow(this);
    }
}

Я просто скопировал ViewServer.java в свой проект - чтобы не создавать зависимости между проектами, работает. 

среда, мая 29, 2013

Прототипирование UI и Pencil

Обнаружил приложение для рисования графических интерфейсов (и не только).
Называется Pencil. Ставится как обычное приложение, т. е. не онлайновое. Особо не разбирался но вроде стоящая вещь.

Содержит элементы GUI для веба, для Windows, для Android (ICS) и для iOS. Есть элементы в рукописном стиле.

Вот так оно выглядит:
Или, например, вот так:

пятница, мая 24, 2013

Spinner, setSelection - не изменяется отображаемое значение

У меня есть Spinner, в нём содержится несколько элементов.
В то время когда spinner свёрнут, мне нужно задать в качестве выбранного какой-то из этих элементов, к примеру - второй (если считать с нуля - то первый):

spinner.setSelection(1);

К удивлённому сожалению, в результате наблюдается следующий эффект:
1. в качестве отображаемого в свёрнутом состоянии значения так и осталось значение, соответствующему самому первому элементу
2. если спиннер развернуть - то увидим, что выбран как раз тот элемент, который просили - а именно, второй.

Чтобы привести в соответствие ожидание и реальность, достаточно добавить второй аргумент - параметр animate, равный true. В таком случае всё работает как ожидалось:

spinner.setSelection(1, true);






пятница, апреля 26, 2013

Поместить в TextView текст в формате html и сделать ссылку нажимаемой

Понадобилось:
1. поместить в TextView получаемый с сервера текст, отформатировнный под html
2. сделать так, чтобы при нажатии на ссылку, содержащуюся в этом тексте, открывался бы браузер - и показывал бы содержимое, нажатой ссылке соответствующее.

Очевидное решение использовать

                android:autoLink="web"
                android:linksClickable="true"
привело только к тому, что ссылки выделялись красивым синим цветом, но при нажатии на них ничего не происходило.

Гуглопоиск выдал ссылку с таким работающим решением:
1. не использовать очевидное решение, оставить TextView в самом простом виде (без android:autoLink и android:linksClickable):

            <TextView

                android:id="@+id/txtView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

2. сделать следующее:
textView.setMovementMethod(LinkMovementMethod.getInstance());

3. после чего можно спокойно присваивать текст:
textView.setText(Html.fromHtml(text))

Упаковал всё это в утилити-метод

public static void showHtml(TextView textView, String text) {
textView.setText(Html.fromHtml(text));
textView.setMovementMethod(LinkMovementMethod.getInstance());
}

и красота.

суббота, апреля 13, 2013

Evernote и код ошибки 2732

При обновлении Evernote получил сообщение об ошибке с кодом 2732. Аналогичное сообщение получил при попытке просто удалить приложение.

Вылечилось запуском Evernote.msi из C:\User\userName\AppData\Local\Temp

суббота, марта 16, 2013

android:listSelector

Столкнулся с тем, что селектор для ListView, заданный при помощи android:listSelector, обрабатывается по-разному в android 2.2 и в 4.x

Селектор был объявлен так:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/green_background_light" android:state_selected="true"/>
    <item android:drawable="@color/green_background_light" android:state_pressed="true"/>
    <item android:drawable="@color/background_default"/>
</selector>

Есть стиль:

    <style name="ListView" parent="@android:style/Widget.ListView">
        <item name="android:cacheColorHint">#00000000</item>
        <item name="android:listSelector">@drawable/background_selector_normal</item>
        ...   ...    ...
    </style>


Этот стиль уже применяется к ListView.
При запуске на устройствах с андроидом 4.х элементы списка ведут себя ожидаемым образом - при нажатии и до отпускания элементы меняют цвет фона на заданный в селекторе.
При запуске на 2.2 увидел, что цвет фона меняется для всего listView целиком - более того, после отпускания элемента сам список так и остаётся гламурно-зеленоватым, а элемент, для которого было выполнено нажатие, меняет цвет фона на заданный по-умолчанию.

Чтобы достичь желаемого поведение и на старых устройствах, нужно в селекторе вместо объявления цвета использовать "честные" drawable:


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/green_background_light" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/green_background_light" />
        </shape>    
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/background_default" />
        </shape>      
    </item>
</selector>

четверг, февраля 21, 2013

Выделить фоном нажатия элементов ListView

Чтобы нажатый элемент ListView выделялся бы нужным фоном, нужно:

1. определить цвет для "обычного" фона, используемый для исходного состояния, и цвет для фона, используемого для выбранного или нажатого элемента списка:


    <color name="background_default">...</color>
    <color name="background_selected">...</color>

2. создать селектор для выбора цвета фона в зависимости от состояния элемента
drawable/item_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/background_selected" android:state_pressed="false" android:state_selected="true"/>
    <item android:drawable="@color/background_selected" android:state_pressed="true"/>
    <item android:drawable="@color/background_default"/>
</selector>

3. указать свежесозданный селектор в качестве фона для элемента, отображаемого в списке
layout/listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/listitem_background_selector" ... ... ...>
   ... ... ...

</LinearLayout>

вместо п. 3 можно сделать проще и указать свойство ListView:
android:listSelector="@drawable/background_selected"

Готово.

воскресенье, февраля 17, 2013

Как показать в WebView страницу целиком

С настройками по-умолчанию WebView не даёт возможности уменьшить отображаемую страницу так, чтобы она показалась бы целиком - пусть и мелко.

Добавить такую возможность легко:

webView = (WebView) findViewById(R.id.webview);
WebSettings settings = webView.getSettings();


settings.setLoadWithOverviewMode(true);
settings.setUseWideViewPort(true);