Category: Android

Posts on Android development

  • Delete files by mask in Bash (Terminal)

    Go to the folder, where you want to delete for instance all mp3 files in this folder and it’s subfolders and type this:

    $ for i in $( find . -name "*.mp3" ); do rm -f $i; done  
    

    If you want to delete files by mask only in current folder, type this:

    $ rm -rf *.mp3
    
  • Паттерны проектирования

    Заметки при чтении книги “Паттерны проектирования” (Эрик и Элизабет Фримен)

    ——————————————————————————————————-

    Examples Source Code: GitHub

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

    Скачайте примеры кода на Java c GitHub.

    ——————————————————————————————————-

  • Мои заметки после работы с VBA (Tips and tricks)

    Конвертация из String в Integer:

     i = CInt(s)
    

    Конвертация из Integer в String:

    s = str(i)
    

    Активация конкретного листа:

    sheets("mytabname").activate
    

    Использование циклов Do и выход из циклов:

    
    Do [{While | Until} condition]
    [statements]
    [Exit Do]
    [statements]
    Loop
    
    Or, you can use this syntax:
    Do
    [statements]
    [Exit Do]
    [statements]
    Loop [{While | Until} condition]
    

    Процедура для удаления пустых строк

    Private Sub CommandButton3_Click()
    'Delete empty lines
    
    Dim numberOfRows, count As Integer
    Dim sheetName As String
    
    sheetName = TextBox3.Text
    Sheets(sheetName).Activate
    
    numberOfRows = CInt(TextBox1.Text)
    count = 0
    
    For i = numberOfRows To 1 Step -1
        If (Cells(i, 1).Value = Empty) Then
            count = count + 1
            Cells(i, 1).EntireRow.Delete
        End If
    Next i
        
    MsgBox ("Finished. Number of deleted rows is" + Str(count))
    
    End Sub
    

    Проверка того, что ячейка пуста и удаление целой строки:

    If (Cells(i, 1).Value = Empty) Then
            count = count + 1
            Cells(i, 1).EntireRow.Delete
    End If
    

    Показ сообщения с числом каким-нибудь:

    MsgBox ("Finished. Number of deleted rows is" + Str(count))
    

    Добавление данных на другой лист:

    Worksheets("XProdRugSets").Cells(i + j - firstRugSetIDRow + 1, 1).Value = ProdID
    
  • Конструкция “for each” в Java

    Недавно задался вопросом, есть ли такая конструкция в Java. Ясного ответа сразу не нашел. Некоторые говорят на форумах, что нет, а некоторые говорят, что есть, но как-то хитро через коллекции. Так вот, привожу пример своего кода, в котором использован аналог “for each” в Java:

    <br />
    Elements links = doc.select(“link”);<br />
    for (Element link : links) {<br />
          linksList.add(link.text());<br />
          Log.v(TAG, “link:”+link.text());<br />
    }<br />
    
  • Плагин WordPress для увеличения изображений (Plugin for resizing images on WordPress)

    По умолчанию WordPress увеличивает картинку, открывая целую страницу либо в текущем, либо в новом окне. Я долго искал плагин, который бы позволял увеличивать изображение в той же странице. Изучив три плагина, я все таки нашел четвертый, который мне подошел. Итак, называется он Auto Thickbox Plugin For WordPress и скачать его можно на странице плагинов WordPress или на официальной странице, где я и скачал.

    Кликните на следующую картинку, чтобы посмотреть, как это работает:

  • Android 2.3.3: “Waiting for debugger to attach”

    Не работал Debug на Android 2.3.3, а на Android 4.0.3. работал. Решил данную проблему простым перезапуском Eclipse и AVD Android 2.3.3.

    Решение нашел здесь в комментарии к правильному ответу.

  • Обновление ListView в Android

    Мейнстрим решением для обновления ListView после изменения данных является использование метода arrayAdapter.notifyDataSetChanged(), где arrayAdapter – Ваш адаптер. Но к сожалению, это не всегда срабатывает.

    Я использовал в своем случае другое решение, которое сработало – просто переопределял адаптер целиком. Теперь таблица обновляется после изменения данных в массиве, с которым она связана.

    private ArrayAdapter arrayAdapter;
    arrayAdapter = new ArrayAdapter
    (this, R.layout.list_item, diseasesArray);
    setListAdapter(arrayAdapter);
    //
    //Здесь код по обновлению данных в diseaseArray
    //
    arrayAdapter = new ArrayAdapter
    (DiseaseActivity.this, R.layout.list_item, diseasesArray);
    setListAdapter(arrayAdapter);
    
  • Парсим XHTML с помощью JSoup в Android

    Расскажу о том, как можно распарсить XHTML или даже HTML с помощью JSoup в Android. Лично я парсил XHTML. Для этого нужно:

    1. Скачать jar файл JSoup библиотеки здесь.
    2. Подключить JSoup.jar к нашему проекту. Для этого нажимаем правой кнопкой на проект, далее выбираем Build Path->Configure Build Path.

      В появившемся окне нажимаем Java Build Paths, далее выбираем вкладку Libraries и добавляем через Add Jars.
    3. Создать объект класса Document, который, кстати, должен быть именно из Jsoup библиотеки, а не родных библиотек. Это можно выбрать при нажатии Shift+Cmd+O после того, как вы добавили код, использующий JSoup. Объект класса Document в данном случае создается из того, что подкачивается через URL. Далее с этим объектом можно работать. Например, в данном случае из него извлекаются все ссылки с тэгом а, и создается массив из ссылок и их атрибутов href. Сначала все добавляем в структуру ArrayList, затем ArrayList заносим в String[] массив. Все, что добавлено, пишется в LogCat через Log.v. В данном случае, метод doInBackground должен быть в составе класса AsyncTask, просто не хочу приводить весь код, это будет лишним.
      private static final String TAG = "DiseaseActivity";
      private ArrayList<String> diseasesList = new ArrayList<String>();
      private ArrayList<String> linksList = new ArrayList<String>();
      	
      private String[] diseasesArray = new String[]{"Загрузка болезней"};
      private String[] linksArray = new String[]{"Ссылка"};
      
      public static String[] ConvertToStringArray(ArrayList list)
          {
              return (String[])list.toArray(new String[0]);
          }
      
      protected Void doInBackground(String... urls) {
                  try 
                  {
                  	String urlString = urls[0];
                      Document doc = Jsoup.connect(urlString).get();
                      Elements links = doc.select("a");
                      diseasesList.clear();
                      linksList.clear();
                      for (Element link : links) {
                      		diseasesList.add(link.text());
                      		linksList.add(link.attr("href"));
                      		Log.v(TAG, e.text());
                      }
                      diseasesArray = ConvertToStringArray(diseasesList);
                      linksArray = ConvertToStringArray(linksList);
                  } 
                  catch (ClientProtocolException e) 
                  {
                      Error = e.getMessage();
                      cancel(true);
                  } 
                  catch (IOException e) 
                  {
                      Error = e.getMessage();
                      cancel(true);
                  }
                  return null;
              }
      

    Это лишь один из примеров использования JSoup. Возможностей у него много и здесь можно найти более подробное их описание.

  • Интернет через Proxy на симуляторе Android

    В отличие от симулятора iPhone, эмулятору Android нужно объяснять, как ему выходить в интернет. Здесь речь пойдет о случае, когда вы работаете через Proxy.

    Неработоспособность интернета на эмуляторе Android – общая проблема и широко обсуждается на StackOverflow. Я задал также свой вопрос там, но мне не смогли помочь, в итоге я сам же и ответил на свой вопрос.

    Существует решение данной проблемы, которое отличается от того, которое приведу я. В нем используются настройки эмулятора через приложение Настройки.

    Итак, последовательность действий, чтобы интернет у Вас заработал:

    • В Eclipse заходим в Run Configurations. См. рисунок. При нажатии он увеличивается.
    • Нажимаем на Target для нашего проекта. Прокручиваем вниз и вводим настройку Proxy в поле Additional Emulator Command Line Options. Я не знал, что нужно прокручивать, и искал это поле очень долго. В случае использования эмулятора версии 2.3.3. вводим
      -dns-server 8.8.8.8 -http-proxy 172.28.111.1:3128
      

      Если вы используете эмулятор версии 4.0.3, то dns указывать не надо:

      -http-proxy 172.28.111.1:3128
      

    • Нажимаем Apply, чтобы сохранить настройки и либо нажимаем Run здесь, либо просто запускаем проект как обычно. Обращаю внимание, что для дебага нужно прописать отдельно это же в Debug Configurations.

    Данное решение хорошо тем, что оно не зависит от симулятора и настройки хранятся в Target в проекте, а не вне проекта. Но оно плохо тем, в отличие от решения которое я указал ранее, что нужно все время прописывать эти настройки для всех проектов и всех конфигураций.

  • Page Up и Page Down на Макбуках

    Заменой клавишам PageUp и PageDown на MacBook Pro является сочетание клавиш Fn+Вверх, Fn+Вниз.

    Кроме этого, листать страницы можно вниз и вверх клавишей пробел и Shift+пробел.