Показаны сообщения с ярлыком Android. Показать все сообщения
Показаны сообщения с ярлыком Android. Показать все сообщения

Подборка интересного софта

Годный софт собственной разработки для Android устройств. Приглашаю ознакомиться.

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

Скачать Приходы и расходы с Google Play


IPTV, Video, Поиск - программа для доступа к мультимедиа контенту (IPTV, видео, любимым интернет-страницам) на Android устройствах: телефонах, планшетах, Android TV. Компактная, быстрая интуитивно понятная. Идеально подходит для использования на Smart Box приставках, т.к. собранные в одном приложении возможности обеспечат максимально простой доступ к развлекательному контенту.

Скачать IPTV, Video, Поиск с Google Play


PING & WOL - программа для проверки сетевого соединения (PING), удаленного включения компьютера по технологии Wake-on-LAN, и выключения ПК по протоколу SSH (выключение только для компьютеров на операционной системе Linux).

Скачать PING & WOL с Google Play


Лабиринт - программа построения и прохождения "идеального" лабиринта. По научному это звучит как "генерация и решение лабиринта с помощью метода поиска в глубину по графу". С практической точки зрения в данной реализации программа бесполезна, но познавательна с точки зрения программирования, алгоритмизации и эстетического наслаждения.

Скачать Лабиринт с Google Play


Клад: в поисках легенды - собери все сокровища, доберись до выхода живым! Разрушай стены и заманивай хранителей гробниц в их же ловушки! 40 хардкорных уровней для истинных ценителей жанра. В игре присутствует возможность настройки управления и выбора уровня сложности. Аркадная головоломка по мотивам ретро игры "Rise Out" (1983 г.).

Скачать Клад: в поисках легенды с Google Play


КВ эфир (коротковолновый эфир) - программа для идентификации (поиска) коротковолновых станций по частоте, времени эфира и языку вещания. Использует базы данных из открытых источников HFCC - International Broadcasting Delivery, EiBi Kurzwellen-Hörfahrplan, Numbers & Oddities, Bi Newsletter for DXers (AOKI).

Скачать КВ эфир (коротковолновый эфир) с Google Play


Android. Создание обработчика событий OnClick для кнопки в Realtime

В активности прописываем код:
// Назначить для кнопки button1 событие при нажатии
private void setOnClickListenerForButton1() 
{
   // находим кнопку
   Button button1 = (Button)findViewById(R.id.button1);
   // и назначаем обработчик нажатия
   button1.setOnClickListener(onClickButton1);        
}
    
// Создаем обработчик нажатия кнопки
private OnClickListener onClickButton1 = new OnClickListener() 
{
   public void onClick(View v)
      {
      // Что-то делаем при нажатии на кнопку button1
      }
};    

Android. Создание обработчика событий OnClick для кнопки в дизайнере

В папке с ресурсами (res/layout) находим описание кнопки и добавляем свойство android:onClick="onButtonClick". Обратите внимание на название обработчика событий - его точное написание потребуется на следующем шаге:

<Button
       android:id="@+id/button1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignLeft="@+id/textView1"
       android:layout_below="@+id/textView1"
       android:layout_marginTop="22dp"
       ...
       android:onClick="onButtonClick"
       ...
       android:text="Button"
/>

2. В соответствующей активности прописываем код обработчика. Важно что бы название обработчика совпадало с названием, которое было введено ранее:

public void onButtonClick(View v)
{
    // Что то делаем при нажатии на кнопку

}

Android. Анимационный GIF в кадры PNG или BMP

При разработке приложений для Android, скорее всего вы столкнетесь с задачей получения отдельных кадров из анимированной GIF-картинки и сохранения их (кадров) в формате PNG или BMP.

Программа AniGIFtoPNG может разобрать анимированный GIF на кадры и сохранить их в отдельные файлы в формате PNG или BMP.

Программа AniGIFtoPNG


Скачать программу AniGIFtoPNG для Windows.

Android. Автоматическое создание классов для SQLite

Как показал опыт, создание классов для работы с SQLite весьма кропотливое занятие, особенно если необходимо обслуживать несколько таблиц. Пришла идея разработать программу для автоматического создания java классов для базы данных SQLite.

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

Если выбрать признак "одна таблица" в наследник класса SQLiteOpenHelper, помимо механизма создания таблиц, будут включены основные функции для работы с БД (добавление, удаление, редактирование данных и т.п.). Если установить признак "несколько таблиц" - функции для работы с базой данных будут вынесены в отдельный класс, а наследник класса SQLiteOpenHelper будет содержать только процедуры для создания таблиц.

Программа SQLiteCreator для автоматического создания java классов для SQLite


Скачать программу для SQLiteCreator для автоматического создания java классов для SQLite.

Android Studio. Установка и настройка

Android Studio - среда разработки программного обеспечения для Android девайсов. Как заявляет Google это и тесть та официальная IDE для Android-устройств, а как для меня - это замена старой доброй Eclipse на что-то более новое и современное.

Android Studio


1. Идем на http://developer.android.com/sdk/index.html и скачиваем дистрибутив IDE. Установку можно выполнить полным дистрибутивом из файла "android-studio-bundle-XXX.XXXXXXX.exe (Recommended)" и дальше статью не читать, но поскольку я переезжаю с Eclipse, то в качестве дистрибутива я выбрал, скачал и установил "android-studio-ide-XXX.XXXXXXX.exe (No SDK tools included)".

2. Теперь необходимо указать папки расположения Android SDK Tools (SDK) и Java SE Development Kit (JDK). Для чего при первом запуске выбираем "Configure -> Project Defaults -> Project Structure":

Android Studio. Настройка папок SDK и JDK

Android. SQLite пример использования

Нашел очень классный пример работы с БД SQLite на http://hmkcode.com/android-simple-sqlite-database-tutorial/, настолько наглядный, что переписал его себе.

1. Класс для работы с записями таблице:
package com.hmkcode.android.model;
 
public class Book {
 
    private int id;
    private String title;
    private String author;
 
    public Book(){}
 
    public Book(String title, String author) {
        super();
        this.title = title;
        this.author = author;
    }
 
    //getters & setters
 
    @Override
    public String toString() {
        return "Book [id=" + id + ", title=" + title + ", author=" + author
                + "]";
    }
}


2. Класс для работы с БД:
package com.hmkcode.android.sqlite;
 
import java.util.LinkedList;
import java.util.List;
 
import com.hmkcode.android.model.Book;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
public class MySQLiteHelper extends SQLiteOpenHelper {
 
    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "BookDB";
 
    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // SQL statement to create book table
        String CREATE_BOOK_TABLE = "CREATE TABLE books ( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "title TEXT, "+
                "author TEXT )";
 
        // create books table
        db.execSQL(CREATE_BOOK_TABLE);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older books table if existed
        db.execSQL("DROP TABLE IF EXISTS books");
 
        // create fresh books table
        this.onCreate(db);
    }
    //---------------------------------------------------------------------
 
    /**
     * CRUD operations (create "add", read "get", update, delete) book + get all books + delete all books
     */
 
    // Books table name
    private static final String TABLE_BOOKS = "books";
 
    // Books Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_TITLE = "title";
    private static final String KEY_AUTHOR = "author";
 
    private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR};
 
    public void addBook(Book book){
        Log.d("addBook", book.toString());
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
 
        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(KEY_TITLE, book.getTitle()); // get title
        values.put(KEY_AUTHOR, book.getAuthor()); // get author
 
        // 3. insert
        db.insert(TABLE_BOOKS, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values
 
        // 4. close
        db.close();
    }
 
    public Book getBook(int id){
 
        // 1. get reference to readable DB
        SQLiteDatabase db = this.getReadableDatabase();
 
        // 2. build query
        Cursor cursor =
                db.query(TABLE_BOOKS, // a. table
                COLUMNS, // b. column names
                " id = ?", // c. selections
                new String[] { String.valueOf(id) }, // d. selections args
                null, // e. group by
                null, // f. having
                null, // g. order by
                null); // h. limit
 
        // 3. if we got results get the first one
        if (cursor != null)
            cursor.moveToFirst();
 
        // 4. build book object
        Book book = new Book();
        book.setId(Integer.parseInt(cursor.getString(0)));
        book.setTitle(cursor.getString(1));
        book.setAuthor(cursor.getString(2));
 
        Log.d("getBook("+id+")", book.toString());
 
        // 5. return book
        return book;
    }
 
    // Get All Books
    public List<Book> getAllBooks() {
        List<Book> books = new LinkedList<Book>();
 
        // 1. build the query
        String query = "SELECT  * FROM " + TABLE_BOOKS;
 
        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
 
        // 3. go over each row, build book and add it to list
        Book book = null;
        if (cursor.moveToFirst()) {
            do {
                book = new Book();
                book.setId(Integer.parseInt(cursor.getString(0)));
                book.setTitle(cursor.getString(1));
                book.setAuthor(cursor.getString(2));
 
                // Add book to books
                books.add(book);
            } while (cursor.moveToNext());
        }
 
        Log.d("getAllBooks()", books.toString());
 
        // return books
        return books;
    }
 
     // Updating single book
    public int updateBook(Book book) {
 
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
 
        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put("title", book.getTitle()); // get title
        values.put("author", book.getAuthor()); // get author
 
        // 3. updating row
        int i = db.update(TABLE_BOOKS, //table
                values, // column/value
                KEY_ID+" = ?", // selections
                new String[] { String.valueOf(book.getId()) }); //selection args
 
        // 4. close
        db.close();
 
        return i;
 
    }
 
    // Deleting single book
    public void deleteBook(Book book) {
 
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
 
        // 2. delete
        db.delete(TABLE_BOOKS,
                KEY_ID+" = ?",
                new String[] { String.valueOf(book.getId()) });
 
        // 3. close
        db.close();
 
        Log.d("deleteBook", book.toString());
 
    }
}


2. И пример использования:
package com.hmkcode.android;
 
import java.util.List;
import com.hmkcode.android.model.Book;
import com.hmkcode.android.sqlite.MySQLiteHelper;
import android.os.Bundle;
import android.app.Activity;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        MySQLiteHelper db = new MySQLiteHelper(this);
 
        /**
         * CRUD Operations
         * */
        // add Books
        db.addBook(new Book("Android Application Development Cookbook", "Wei Meng Lee"));  
        db.addBook(new Book("Android Programming: The Big Nerd Ranch Guide", "Bill Phillips and Brian Hardy"));      
        db.addBook(new Book("Learn Android App Development", "Wallace Jackson"));
 
        // get all books
        List<Book> list = db.getAllBooks();
 
        // delete one book
        db.deleteBook(list.get(0));
 
        // get all books
        db.getAllBooks();
 
    }
 
}


На основании этой статьи была разработана программа для автоматиеского создания java классов для работы с БД SQLite - SQLiteCreator.

Android. Преобразование типов переменных

Лучше чем написано на http://study-java.ru/uroki-java/urok-7-preobrazovanie-tipov-v-java/#Stringtodouble я, наверно, не напишу.

Для себя, на всякий случай, сохраню копию страницы, которую можно посмотреть тут.

Android. Типовая настройка Activity

При разработке Android приложений практически всегда приходится настраивать свойства Activity. Что бы упростить этот процесс я набросал "универсальный" код настройки для своих приложений. Этот код позволяет: скрывать заголовок Activity, скрывать строку состояния (это там где часы) и задавать ориентацию экрана.
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();// Скрываем заголовок
    // requestWindowFeature(Window.FEATURE_NO_TITLE); // Скрываем заголовок (для некоторых версий SDK)
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// Скрываем строку состояния
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // Задаем ориентацию: альбомная
    // setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Задаем ориентацию: портретная
    setContentView(R.layout.activity_main);
}

Android. Версия SDK

Иногда в коде требуется определить, под какой версией SDK выполняется код. Сделать это можно так:
public void butClick(View v)
{
    // Определяем версию SDK, под которой запущен код
    if (Build.VERSION.SDK_INT < 16)
    {
      ...         
    }
}

Android. Сделать текст жирным программно

Для того, что бы изменить начертание шрифта, например сделать текст "жирным", делаем так:
public void butClick(View v)
{
    // Находим объект
    TextView textView1=(TextView)findViewById(R.id.textView1);
    // Изменяем свойства текста
    // textView1.setTypeface(null, Typeface.BOLD_ITALIC); // Жирный+наклонный
    textView1.setTypeface(null, Typeface.BOLD); // Жирный
    // textView1.setTypeface(null, Typeface.ITALIC); // Наклонный
    // textView1.setTypeface(null, Typeface.NORMAL); // Обычный
}

Android. Скрыть View

Скрыть View - все очень просто:
public void butClick(View v)
{
    // Находим объект
    TextView textView1=(TextView)findViewById(R.id.textView1); 
    // Скрываем объект
    textView1.setVisibility(View.INVISIBLE); 
}    

Android. Какой View вызвал событие OnClick

Очень часто необходимо определить, какой объект View вызвал событие OnClick. Для того, что бы это сделать, можно поступить следующим образом:
public void butClick(View v) 
{ 
    // Определяем какой View вызвал событие
    switch (v.getId()) 
        { 
             case R.id.button1: 
              .... 
             break; 
             case R.id.button2:
             .... 
            break; 
        }
} 
или
public void butClick(View v) 
{ 
    // Узнаем, какая кнопка вызвала метод, находим её 
    Button btn = (Button) findViewById(v.getId()); 
    // Работаем с текущей кнопкой 
    btn.getText(“Нажата эта кнопка”); 
}