Поиск по этому блогу

понедельник, 17 февраля 2014 г.

Android. Как закрыть приложение по кнопке назад





В классе LoginActivity.java


@Override
public void onBackPressed() {
  Intent intent = new Intent(LoginActivity.this, SplashScreenActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  intent.putExtra("EXIT", true);
  startActivity(intent);
  finish();
}

В классе SplashScreenActivity.java


@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...  
  if( getIntent().getBooleanExtra("EXIT", false)){
    finish();
    return; // add this to prevent from doing unnecessary stuffs
  }
  ...
 
}

Мои приложения в Google Play Store

суббота, 8 февраля 2014 г.

Android. Как сделать приложение с обоями



Для создания приложения с обоями нам понадобятся прежде всего картинки. Заранее подготовленные картинки назовем и поместим в папки. В каждую папку будут помещены картинки для экранов с разным разрешением - от маленьких до самых больших.


jQuery Mobile: Последовательность событий страницы

При переходе со страницы A на станицу B следующие события вызываются

page B---pagebeforecreate

page B---pagecreate

page B---pageinit

page A---pagebeforehide

page B---pagebeforeshow

page A---pageremove

page A---pagehide

page B---pageshow

Вот схема из книги по jQuery Mobile, на которой наглядно показана последовательность, в которой происходят события страницы.



Купить  книгу можно на Amazon


Android. Подключаем библиотеку Support Library

Support Library – библиотека, позволяющая устройствам со старыми версиями Android использовать функции из новых версий. Но что делать, если мы хотим использовать в своем приложении элементы, которые поддерживаются только в новых версиях Android, то тогда нам необходимо использовать эту библиотеку. Библиотека содержит классы, которые являются аналогами классов из новых версий Android.


Для того чтобы загрузить библиотеку необходимо запустить Android SDK Manager


Библиотека будет загружена в папку [Android SDK]\extras\android\support\v4

Я работаю над проектами в Intellij Idea поэтому расскажу как подключить библиотеку в ней. Для того, чтобы добавить библиотеку в проект в корне проекта на одном уровне с папками src и res необходимо создать папку libs, если ее еще не существует. В папку libs необходимо скопировать библиотеку android-support-v4.jar. Для того, чтобы подключить библиотеку Support Library к проекту нужно нажать правой кнопкой по файлу android-support-v4.jar и в меню выбираем "Add as library...".


После добавления файла android-support-v4.jar как библиотеки, становятся доступными java классы из этой библиотеки.


Теперь мы можем импортировать в проект необходимые нам классы из библиотеки android-support-v4
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;

И использовать эти классы в проекте.
public class MainActivity extends FragmentActivity {
 
    ViewPager pager;
    PagerAdapter pagerAdapter;
 
...
 
}

Также вы можете почитать инструкцию с официального сайта. 

В последнем моем приложении с обоями я подключал эту библиотеку


Get it on Google Play


Git. Разница меджу git pull и git fetch

Такой простой и в тоже время такой сложный для меня вопрос - в чем разница между двумя командами - git pull и git fetch. Давайте попробуем разобраться что делает каждая из этих команд.

Git Pull


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

Git Fetch


При использовании команды fetch, git возьмет все комиты оттуда откуда вы делаете fetch и сохранит их в вашем локальном репозитарии. Однако, он не будет мерджить их с той веткой в которй вы сейчас работаете. Это может быть полезным, если вы хотите поддерживать свой локальный репозитарий в актуальном состоянии, но в настоящий момент работаете надь чем-то что может сломаться, если вы обновите свои файлы. Для того чтобы скачанные в локальный репозитарий изменения интегрироватль в свою ветку необходимо использовать merge.

В итоге в чем же разница 


Простыми словами, git pull делает git fetch, а затем сразу же делает git merge в ту ветку в которой вы сейчас работаете. Вы можете сделать в любое время git getch для того, чтобы обновить вашу локальную копию удаленного репозитария. Эта операция не изменит ни одну из ваших веток и безопасна, в том числе, и для той ветки, в которой вы сейчас работаете. Git pull можно использовать для того чтобы держать свой локальный репозитарий в соответствии с состоянием удаленного рапозитария. На просторах интернета отыскал очень полезную схему работы с git.  На картинки достаточно наглядно показано, что делает команда git fetch и git pull.


А также, еще нашел один очень полезный сайт про Git, на котором можно увидеть для чего нужны команды git и что именно они делают - http://ndpsoftware.com/git-cheatsheet.html#loc=index


Как в Java преобразовать Object в Long


Допустим, у нас есть метод, который может возвращать ArrayList как Integer объектов так и Long объектов. В таком случае наш метод будет возвращать просто ArrayList состоящий из объектов, то есть ArrayList<Object>. Полученные объекты может понадобится конвертировать в Long. Как это сделать. Каждый объект типа Object можно преобразовать в строку, а строку уже можно распарсить при помощи метода класса Long - Long.parseLong(String str) 
public class Example1 {
  public static void main(String[] args) {
    List<Object> objects = new ArrayList<Object>();
    objects.add(new Integer(55));
    objects.add(new Long(80));
    objects.add(new Integer(66));
    objects.add(new Long(90));
    for (int i = 0; i < objects.size(); i++) {
      Long a = Long.parseLong(objects.get(i).toString());
      System.out.println(a); 
    } 
 
  }
 
}


пятница, 7 февраля 2014 г.

Как форматировать дату в Javascript

Форматирование даты в JavaScript согласно определенному формату (шаблону) стандартными средствами не очень удобно. Поэтому для форматирования даты удобно использовать  библиотеку Date Format 1.2.3

На сайте автора библиотеки http://blog.stevenlevithan.com/archives/date-time-format  подробно описывается как работать с этой библиотекой.

После подключения скрипта форматирование даты становится очень простым
var now = new Date();
now.format("m/dd/yy");    // 2/07/14
now.format("dd.mm.yyyy")  // 07.02.2014
now.format("dd mmm")      // 07 Feb

четверг, 6 февраля 2014 г.

Android. Flexible RelativeLayout with ViewPager and Button

В том случае, когда нужно чтобы кнопка находилась внизу под компонентом и все это прекрасно растягивалось и не наезжало друг на друга при изменениях размеров экрана я использую следующую верстку. Берем RelativeLayout в качестве корневого в активити. Добавляем в него компонент, который будет растягиваться и ему задаем свойства
android:layout_above="@+id/setWlpBtn" //компонент будет над кнопкой
android:layout_marginBottom="10dip" //от компонента будет отступ в 10px

Для кнопки, которая будет под компонентом указываем следующее свойство
android:layout_alignParentBottom="true" //кнопка будет внизу активити

Layout полностью
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
    <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_above="@+id/setWlpBtn"
            android:layout_marginBottom="10dip">
    </android.support.v4.view.ViewPager>
 
    <Button
            android:id="@+id/setWlpBtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/set_wlp_button_title"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="50dp"
            />
 
</RelativeLayout>


В последнем моем приложении с обоями я использовал подобную разметку


Get it on Google Play


Ускоряем Phonegap

Разрабатываю приложение на стеке технологий PhoneGap и jQueryMobile. Приложение, которое получилось в итоге оказалось не таким быстрым как нативные приложения. Начал искать способы повышения производительности работы приложения. Нашел много интересной информации для себя. Что можно сделать для того, чтобы приложение, написанное при помощи phonegap и jQueryMobile стало работать быстрее.



Что делать для повышения скорости работы приложения


1. Библиотека fastclick. Ускоряем нажатие кнопок

fastclick - библиотека, которая ускоряет нажатие на кнопки в мобильном браузере. Эта библиотека устраняет задержку в 300 мс между физическим нажатием на экран телефона и вызовом события click в мобильных браузерах. Причина такой задержки в мобильных браузерах следующая.

Мобильные браузеры будут ждать около 300 мс с момента, когда вы нажмете кнопку, чтобы инициировать событие click. Причина этого в том, что браузер ждет, чтобы определить, на самом ли деле вы выполняете двойное нажатие.   

2. Отключаем часть CSS

Причиной медленной работы приложения также могут быть тени и круглые углы элементов. Которые мы и отключим.
* {
text-shadow: none !important;
-webkit-box-shadow: none !important;
-webkit-border-radius:0 !important;
-webkit-border-top-left-radius:0 !important;
-webkit-border-bottom-left-radius:0 !important;
-webkit-border-bottom-right-radius:0 !important;
-webkit-border-top-right-radius:0 !important;
}
Поместите этот код в конец CSS файла.

3. Отключаем градиент

За место CSS градиента лучше использовать заранее сделанные картинки с градиентным фоном

4. Отключаем эффекты jQueryMobile

В методе mobileinit прописать следующий код
$(document).on("mobileinit", function () {
 
  ...
 
  $.mobile.autoInitializePage = false;
  $.mobile.defaultPageTransition = 'none';
  $.mobile.touchOverflowEnabled = false;
  $.mobile.defaultDialogTransition = 'none'; 
 
  ...
 
});

5. Не используйте много изображений в разных файлах

Не используйте много изображений/значков на одной странице. Скомпонуйте все изображения в одно изображение и используйте CSS спрайт. Как сделать спрайт я написал тут.

Источники

http://stackoverflow.com/questions/19849637/how-to-use-fastclick-js-with-phonegap-and-jqm
http://phonegap-tips.com/articles/fast-touch-event-handling-eliminate-click-delay.html
http://publish.illinois.edu/weiyang-david/2013/06/05/phonegap-app-problemssuggestions/
https://github.com/ftlabs/fastclick
http://www.codefessions.com/2012/09/creating-native-user-experience-with.html
http://www.codefessions.com/2012/10/improving-performance-of-html5-based.html
http://codedrop.com.au/blog/phonegap-performance-tips
http://therockncoder.blogspot.ru/2012/06/three-quick-performance-tips-for.html
http://www.tricedesigns.com/2013/03/11/performance-ux-considerations-for-successful-phonegap-apps/
http://www.adobe.com/devnet/phonegap/articles/apple-application-rejections-and-phonegap-advice.html
http://www.tricedesigns.com/2013/01/18/my-workflow-for-developing-phonegap-applications/
http://www.tricedesigns.com/
http://stackoverflow.com/questions/12081226/phonegap-jquery-mobile-improvements/12081339#12081339
http://stackoverflow.com/questions/12081226/phonegap-jquery-mobile-improvements/12081339#12081339
http://stackoverflow.com/questions/8208679/android-performance-jquery-phonegap-issue
http://stackoverflow.com/questions/13904315/android-webview-late-rendering/14010732#14010732
https://groups.google.com/forum/#!topic/phonegap/bv3lLlsgr74
http://coenraets.org/blog/2013/05/top-10-performance-techniques-for-phonegap-applications/

Список вопросов на собеседовании iOS программиста

Так как занимаюсь в том числе и разработкой приложений для iOS, то решил собирать вопросы, которые обычно задают на собеседовании на должность iOS программиста. Буду периодически добавлять новые вопросы. Буду писать вопрос и сразу на него ответ.


1. Разница между NSInteger и int
2. Расскажите в каких пяти состояниях может находится iOS приложение
3. Что будет, если отправить сообщение нулевому указателю
4. Как работает подписывание кода
5. Разница между NSSet и NSArray
6. Что означает NS в именах классов и зачем эта приставка нужна.

воскресенье, 2 февраля 2014 г.

Android. Добавляем splash-screen к нашему приложению

Создание экрана загрузки (Splash Screen) для Android-приложения при помощи таймера. 


1. Для создания экрана загрузки (Splash Screen Activity) создадим класс SplashScreenActivity.java

2. Откроем наш AndroidManifest.xml файл и убедимся, что splash screen activity является стартовой активити проекта.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="pro.newapp.MarkXWallpapers"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8"/>
    <application android:label="@string/app_name" 
        android:icon="@drawable/icon_markx">
        <activity android:name="MainActivity"
                  android:label="@string/app_name"
                  android:configChanges="orientation"
                  android:screenOrientation="portrait">
        </activity>
        <activity android:name=".SplashScreenActivity"
                  android:configChanges="orientation"
                  android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
        </activity>
    </application>
</manifest>

3. Создадим layout-файл для заставки (для splash screen) в папке res/layout. Я назвал этот файл splash_screen.xml. В мое заставке содержится изображение из приложения и логотип нашей компании, а также адрес сайта.

<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
 
    <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/new_app_logo"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="50dp"/>
 
    <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/markx_logo"
            android:layout_centerInParent="true"
            android:layout_weight="1"/>
 
    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:gravity="center_horizontal"
              android:text="@string/new_app_site"
              android:textSize="22dp"
              android:layout_marginBottom="20dp"
              android:height="50dp"/>
 
</LinearLayout>

4. Добавим следующий код в класс SplashScreenActivity.java. В этом фрагменте кода используется handler, который будет ждать в течении заданного времени и по истечению таймера будет запускаться главная активити проекта.

public class SplashScreenActivity extends Activity {
 
    private static int SPLASH_SCREEN_TIMEOUT = 2500;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.splash_screen);
 
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, SPLASH_SCREEN_TIMEOUT);
    }
 
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
 
}

Как это работает в настоящем приложении вы можете посмотреть тут



суббота, 1 февраля 2014 г.

Android. Как заблокировать автоповорот экрана

Перехват события разворота экрана


Для того, чтобы самому перехватывать событие, которое будет происходить при автоповороте экрана устройства необходимо в файле AndroidManifest.xml в соответствующей активити прописать следующий атрибут

android:configChanges="orientation">

Описание активити будет выглядеть так

<activity android:name="MainActivity"
          android:label="@string/app_name"
          android:configChanges="orientation">
</activity>

Теперь необходимо в файле java класса соответствующей активити переопределить метод

onConfigurationChanged

и в этом методе задать какую ориентацию экрана мы хотим

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Метод будет выглядеть вот так

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Задаем ориентацию экрана при запуске приложения


Если вы хотите, чтобы активити всегда была в определенной ориентации, то необходимо в файле AndroidManifest.xml для соответствующей активити прописать атрибут

android:screenOrientation="portrait">

Вот так будет выглядеть описание активити

<activity android:name="MainActivity"
          android:label="@string/app_name"
          android:configChanges="orientation"
          android:screenOrientation="portrait">
</activity>

Как это работает в настоящем приложении вы можете посмотреть тут