Страницы

Поиск по вопросам

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

понедельник, 13 апреля 2020 г.

Как программно запускать браузер из приложения и закрывать его, когда пользователь что-либо скачает?

#android_sdk #android

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


Ответы

Ответ 1



Стандартно делается это так: 1) Интент new Intent(Intent.ACTION_VIEW, Uri.parse(url)) далее запуск активити браузера через startActivityForResult 2) Вызвавший интент активити по окончании работы браузера получит onActivityResult, где вы сможете в зависимости от результата выставить сообщение или что там у вас. По параметрам и проч. см. в документации. Но есть одна трабла - заставить браузер закрыться после окончания скачивания - это вряд ли... Есть конечно варианты реализации функционала другим способом: Напрямую выкачивать минуя браузер Выкачивать через WebView (по сути все тот же браузер, только как часть вашей проги)

Android: Preferences

#android_sdk #android #eclipse #java

                    
Проблемы с Preferences.
Есть 2 активности (класса). В одной ключ "number" равен 0,а в другой (в которой я
работал с этим ключом) = 2.
(Я при запуске программы выгружаю ключи). Код одинаковый и в одинаковых местах (OnCreate),
разные только имена переменных:
notes = getPreferences(MODE_WORLD_WRITEABLE);
            Editor ed = notes.edit();
        textView1.setText(String.valueOf(notes.getInt("number", 0)));
    


Ответы

Ответ 1



SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String val = prefs.getString("number", ""));

Как запустить виджет в Android-эмуляторе?

#android_sdk #android

                    
Вот сделал я Android виджет. Хочу добавить его на хоумскрин, но при добавлении не
вижу. При запуске в эклипсе вот что пишет:  



Что делать? Как быть?
    


Ответы

Ответ 1



Попробуй длинный тычок на пустое место, куда добавил виджет. Если появится контекстное меню или таскалка - значит, виджет добавился, но невидимый (с прозрачной картинкой) - т.е. ты что-то напутал с ресурсом, который у тебя на виджете должен отображаться. Еще была пара случаев, когда это случалось совсем спонтанно, помогал клин-редеплой. Возможно, sdk глюкнуло и забыло упаковать картинку в apk. // FIXME В след. раз лучше делай скриншот вкладки LogCat, в логе консоли видно только установку приложения

четверг, 9 апреля 2020 г.

Как сделать, чтобы шкала Progress Bar падала каждую секунду?

#java #android #android_sdk

                    
Как сделать так, чтобы шкала прогресса бара в Android Studio уменьшалась, к примеру,
каждую секунду на одну единицу?
    


Ответы

Ответ 1



Вариант №1 Используете CountDownTimer ProgressBar mProgressBar; CountDownTimer mCountDownTimer; int i=0; mProgressBar=(ProgressBar)findViewById(R.id.progressbar); mProgressBar.setProgress(i); mCountDownTimer=new CountDownTimer(5000,1000) { @Override public void onTick(long millisUntilFinished) { Log.v("Log_tag", "Здесь фиксируется каждая секунда"+ i+ millisUntilFinished); i++; mProgressBar.setProgress(i); } @Override public void onFinish() { // Здесь заканчивается 5 секунд i++; mProgressBar.setProgress(i); } }; mCountDownTimer.start(); Вариант №2 Создаете AsyncTask или другой вид потока. Создаете цикл, который заканчивается когда ваша задача закончилась В цикле делаете задержку в минуту и меняете значения progress bar

Хранение авторизации Vkontakte в android приложении

#android #android_sdk #vkontakte_api #вконтакте

                    
Необходима авторизация через Вконтакте в приложении. Как лучше всего хранить полученный
токен авторизации в приложении и как подставлять его автоматически если он еще не устарел?
SharedPreference и SQLite небезопасны. Есть возможность хранить во внешней MySQL базе.
    


Ответы

Ответ 1



SharedPreference с MODE_PRIVATE http://developer.android.com/reference/android/content/Context.html#MODE_PRIVATE будет доступно только для текущего приложения Если это кажется недостаточно безопасным можно использовать реализацию с шифрованием https://github.com/scottyab/secure-preferences

вторник, 7 апреля 2020 г.

Обновить widget при изменения данных сайта http/https

#android #android_sdk #android_studio

                    
Я сделала виджет) который показывает статистику и новости, с сайта. Всё работает
отлично. Я хочу чтоб он обновлялся, когда данные страницы меняются. Первая идея была
делать запрос, и если данные изменились, то выводить уже к примеру уведомление."новые
новости". Но начала читать и пишут, что это антипаттерн, так делать нельзя, тк батарея
садится. А как тогда сделать? Есть ли возможность обновить виджет сразу, после такого
как изменились определенные данные на страничке?
    


Ответы

Ответ 1



Есть мысль использовать Push-уведомления и обновлять данные, когда придет пуш на устройство. Идея такая: веб-мастер правит страницу - посылается пуш на девайс - а далее несколько вариантов: либо особый запрос слать на сервер, либо какие-то данные получать из пуша. Но максимальный размер пуша - 4КБ. Ну и способ влоб вы уже частично описали: запрос в AlarManager, который например раз в час будет долбить сервер и обновлять виджет.

воскресенье, 29 марта 2020 г.

Пришло уведомление что нужно удалить права READ_SMS and READ_CALL_LOG

#android #android_sdk


Пришло уведомление что нужно удалить права READ_SMS and READ_CALL_LOG, но эти права
мне нужно, я описал им в запросе который они мне отправили, но ответили что нужно удалить
эти права, мое приложение считывает данные sms и звонков и выбирает подходящий тариф,
требуют удалить запросы на эти разрешения, как мне быть, кто что сделал?

прислали ссылку в письме для чтения

https://support.google.com/googleplay/android-developer/answer/9047303
    


Ответы

Ответ 1



Это один из самых сложных вопросов для разработчкив Андроид на текущий момент. Из-за некоторых обстоятельств, была изменена политика конфиденциальности, которая урезала возможности использования разрешений категории READ_SMS и READ_CALL_LOG. Единственный вариант, который позволяет сохранить возможность использовать данные разрешения, после получения данной формы - это еще раз выпустить новый релиз приложения, в котором нужно будет выбрать категорию, почему нужны эти разрешения. Но никаких гарантий успеха это не дает, на платформах Реддит, Медиум и т.д. идет активное обсуждение историй, когда одним разработчикам удавалось добиться своего, а вторым - нет. При том никакого шаблоного варианта успеха нет, по какому критерую в итоге все таки пропускают избранные приложения до сих пор не понятно (потому что нещадно удаляются даже приложения с высоким рейтингом и милионным количеством скачек). На Реддите даже есть история о том, как человеку сначала дали добро, а потом через 3 дня пришло новое сообщение, что в связи с новыми обстоятельствами прошлое решение анулируется, и в итоге разрешения использовать нельзя. Так же есть проблемой то, что процесс рассмотрения данного вопроса довольно длительный, и может занимать несколько недель. Да и после этого рассмотрения зачастую приходит лаконичное сообщение "нет, нельзя" без какого-либо подробного описания. В итоге, остается лишь уповать на вариант избавления от разрешений, заменяя функциональность на альтернативные решения.

четверг, 19 марта 2020 г.

Эмулятор андроида не показывает изменений

#android_sdk #android #java


Здравствуйте. Установил все необходимое, как тут. Создаю проект, но когда запускаю
эмулятор, то все мои изменения в Strings.xml, в нем не отображаются, вместо этого на
экране эмулятора только надпись Android. В Graphical Layout в main.xml все изменяется,
но в запущенном эмуляторе все та же надпись. Что делать?


    


Ответы

Ответ 1



Эмулятор андроида грузится долго. Уверен что эмулятор до конца загрузился? После загрузки эмулятора нужно своё приложение ещё в нём запустить, если запуск происходит впервые. При изменении проекта обязательна перекомпиляция и повторный запуск.

вторник, 17 марта 2020 г.

Android, GridLayout для 2.3 верии системы

#android_sdk #android #java


Добрый день, подскажите, пожалуйста, вот у меня в интерфейсе используется GridLayout,
который поддерживается с API 14, а есть ли способы как-то сделать чтобы GridLayout
работал и на 10-11 API?
Мне говорили, что что-то нужно до установить, но я не понимаю, что и как.
Заранее спасибо за помощь!    


Ответы

Ответ 1



Вам нужно подключить к проекту support library v7. После этого используйте в коде и XML-layout'ах android.support.v7.widget.GridLayout вместо android.widget.GridLayout.

пятница, 13 марта 2020 г.

Как запретить использовать приложение без интернета?

#java #android #android_sdk #безопасность


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

Есть ли универсальное решение?
    


Ответы

Ответ 1



Можно по разному: Проверять на входе в приложение наличие интернета, т.е. при запуске главного Activity. И не стартовать к-л задачи до успешной проверки. Сделать активити-проверщик интернета. Запускать на нынешнюю главную а эту. Если интернет есть, то запускать нынешнюю главную. Иначе - выходить из приложения. Обернуть все нынешние запросы в сеть в класс, проверяющий перед запуском задачи наличие инета. Если он есть - продолжаем, иначе - закрываем приложение. Проверить же наличие соединения с сетью (не факт, что там есть сам интернет) можно, согласно en-SO, так: public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); } Также надо добавить спец. разрешение в AndroidManifest.xml: Ещё момент: если надо проверять именно факт подключённости с интернету (а не подключено-или-подключается) то использовать надо netInfo.isConnected() вместо netInfo.isConnectedOrConnecting(). Проверить же есть ли интернет как таковой можно вот так: public boolean isInternetAvailable() { try { InetAddress ipAddr = InetAddress.getByName("google.com"); //можно заменить на к-л другой сайт if (ipAddr.equals("")) { return false; } else { return true; } } catch (Exception e) { return false; } } И не забываем про все нужные разрешения в манифесте:

Ответ 2



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

Не работает автозапуск сервиса при загрузке телефона

#java #android #android_sdk #android_studio


Не получается настроить автозапуск сервиса при загрузке телефона. BroadcastReceiver
просто не отрабатывает.

В манифесте:  




  
    
  



Код ресивера

public class MyReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("======MyReceiver=======", "------onReceive-----");
        context.startService(new Intent(context, MyService.class));
    }
}


После установки перед перезагрузкой запускал, тестировал приложение, как сказано здесь

Пробовал добавлять другие интент-фильтры:  






От прочих системных событий ресивер тоже не срабатывает. Зато вполне успешно запускается
при вызове из другого приложения таким кодом:  

Intent intent = new Intent();  
intent.setAction("com.example.andrey.myapplication.TEST");  
sendBroadcast(intent);  

    


Ответы

Ответ 1



Я думаю ,что проблема в заглавных буквах. action name на самом деле должен выглядеть, как android.intent.action.BOOT_COMPLETED

Ответ 2



Возможно надо не капсом писать, а вот так: android.intent.action.BOOT_COMPLETED

Локализованные ресурсы(масивы) и их использывание

#java #android #xml #android_sdk


Как правильно реализовать роботу локализованных ресурсов?
Делаю так: создаю новый файл ресурсов strings через ПКМ-New-Valuse и там задаю странну,
ну и язык. Получаю уже два файла(правда флаг не тот, но не важно, надеюсь на функционал
не влияет).


Имеются такие массивы:



    Тефтели
    Яблоко
    Пельмени
    Ананас
    Капуста
    Кабачок
    Опельсин
    Лемон
    Желе
    Мед
    Сосиска
    Пицца
    Лук
    Лемонад
    Чай





    Noisettes
    Apple
    Pelmeni
    Pineaple
    Cabbage
    Squash
    Orange
    Lemon
    Jelly
    Honney
    Sausage
    Pizza
    Onion
    Lemonade
    Tea




Делаю так: 

String[] food = getResources().getStringArray(R.array.food);


И вот вопрос, правильно ли я это делаю? А то проверить не получается.
    


Ответы

Ответ 1



Вы все делаете правильно. Стоит заметить, что в Android Studio есть встроенный редактор локализации - Translation Editor, который сильно облегчает работу, как по созданию новой локализации, так и редактированию существующей. Инструмент сам создаст необходимые папки и файлы, вам требуется только выбрать язык и, собственно, заполнить сам перевод в таблице строковых ресурсов. Иконка редактора - синий глобус, попасть туда можно из визуального редактора разметки, открыв любой Layout или нажав на кнопку-ссылку Open Editor, открыв любой файл строковых ресурсов, так же можно кликнуть правой кнопкой мыши на любом файле строковых ресурсов и выбрать Open Translations Editor

AlarmReceiver, WakefulBroadcastReceiver и установка будильников

#android #android_sdk #broadcast_receiver #android_alarm_manager #android_broadcastreceiver


Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему
на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего,
я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий
вопрос: тут мой вопрос.

Подскажите, пожалуйста, как реализовать следующую задачу:
Есть таблица в БД, в которой находятся записи.
Колонки в таблице:
[ID][NAME][DAY][HOURS][MINUTES]

Также есть Активити, которую нужно вызывать в заданное время.

То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить
Alarm-ы, которые будут вызывать Активити.

Содержимое Активити менять не нужно (оно будет менятся уже в onCreate()  самой Активити).

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

Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи
не могу двигаться дальше :( 
    


Ответы

Ответ 1



Попробуйте в Вашем коде заменить на это: AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("alarm message", "alarm message"); if (android.os.Build.VERSION.SDK_INT >= 19) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT); Просто для разных версий андроида регистрация pendingIntent-a происходит по-разному. Плюс, вы всегда регистрировали его под номером 192837, я заменил его на i, так как эта переменная используется в цикле, и она будет уникальная, и каждый последующий pendingIntent не будет перезаписывать предыдущий. Если есть необходимость удалить все зарегестрированные интенты, то вызовите такую функцию: public static void clearAlarmReceiver(Context context, int intentsCount) { for (int i = 0; i < intentsCount; i++) { Intent intent = new Intent(context, CheckAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }

воскресенье, 8 марта 2020 г.

Android logcat не работает

#android #android_sdk #gradle #логирование #logcat


Отлаживаю приложение через USB, Android Studio не пишет ничего в logcat. Раньше все
было отлично, но сейчас вообще не идет никакой информации даже если убрать фильтры.
Копался в Функциях для разработчиков на смартфоне, ничего не нашел. 

вот это я нашел:


    


Ответы

Ответ 1



Если вы запускаете релизную сборку приложения, то у вас, скорее всего, не прописано в gradle debuggable true для неё. buildTypes { release { debuggable true } } Второй вариант включения логов в релизной сборке - указать этот атрибут в манифесте через атрибут тега Application android:debuggable="true" Самый же лучший вариант - настроить варианты для сборки так, чтобы иметь возможность включать/выключать логи для релизной сборки в разных оной вариантах так: buildTypes { debug { resValue "bool", "debuggable", "true" } release { } } productFlavors { dev { resValue "bool", "debuggable", "true" } prod { resValue "bool", "debuggable", "false" } } В манифесте укажите ссылку на сгенерированный градлом ресурс: android:debaggable="@bool/debuggable" Теперь вы сможете собирать devRelease сборку с включёнными логами и prodRelease с выключенными. А debug сборки всегда будут с включёнными логами

Ответ 2



Включите это в Android Studio: Tools -> Android -> Enable ADB Integration

вторник, 25 февраля 2020 г.

Доступ к журналу (Log) SMS в Android

#android_sdk #android #sms #java


Здравствуйте. Знаю, что в SDK есть классы и методы для доступа к журналу звонков
в ОС Android. Есть ли такая же возможность для SMS? Т.е. стоит задача: получить список/массив
входящих SMS с текстом, номером приславшего, датой-временем и проч. информацией.    


Ответы

Ответ 1



Uri uriSms = Uri.parse("content://sms/inbox"); Cursor c = context.getContentResolver().query(uriSms, null,null,null,null); // column names for above provider: 0: _id 1: thread_id 2: address 3: person 4: date 5: protocol 6: read 7: status 8: type 9: reply_path_present 10: subject 11: body 12: service_center 13: locked Вместо inbox могут также использоваться другие категории например sent

Ответ 2



mText.append("\n\n SMS сообщения"); mText.append("\n-------------------------------------------------------------"); Uri uriSms = Uri.parse("content://sms/"); Cursor cur = mainContext.getContentResolver().query(uriSms, null,null,null,null); startManagingCursor(cur); SimpleDateFormat format1 = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy"); if (cur.getCount() > 0){ while (cur.moveToNext()){ mText.append("\n" + format1.format(cur.getLong(4)) + " " + cur.getString(2) + ": " + cur.getString(12) ); mText.append("\n"); } } mText.append("\n########################################"); Знаю, что в SDK есть классы и методы для доступа к журналу звонков в ОС Android если знаешь можешь помочь? где почитать?

Ответ 3



AndroidManifest LayOut

Как запустить android приложение с определенными JVM флагами?

#android #android_sdk


Вот такая ситуация: падает приложение с ошибкой outOfMemoryError. Хочу отловить это
событие и хочу, чтобы когда это случилось, JVM создал HPROF файл. Как запустить приложение
на устройстве с определенными JVM флагами? Обычно это делалось просто -XX:HeapDumpOnOutOfMemoryError.
Или может есть какие-то встроенные удобные тулзы в Android Studio? Потому что я хочу
запихнуть этот HPROF файл в MemoryAnalyzer. Но, может, этот метод уже устарел?
    


Ответы

Ответ 1



HeapDumpOnOutOfMemoryError это флаг Oracle VM, в Dalvik и ART его нет. В общем нужно или вручную создавать HPROF или если скажем проблема у заказчика - натыкать запись в лог состояние памяти по всему коду. Ну и перехватывать OOMe тоже можно, только ловить не Exception a Error, в try-cach или глобально. См. также видео с Google IO на эту тему - https://www.youtube.com/watch?v=_CruQY55HOk

Не импортируется TabLayout

#java #android_sdk #android


При попытке написать:  

TabLayout tabLayout = new TabLayout(this);  

выскакивает ошибка:


  TabLayout cannot be resolved to a type


Что делать?

Вот полный код:

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        LinearLayout v = (LinearLayout)findViewById(R.id.LinearLayout_for_tabs_1);

        TabLayout tabLayout = new TabLayout(this);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));

        tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
50));

        v.addView(tabLayout);
    }
}

    


Ответы

Ответ 1



У вас не подключена библиотека support:design. Чтобы подключить библиотеку в Eclipse: Скачайте её через SDK Manager в Eclipse - New->Android_project_from_existing_code Ищем в папке ПУТЬ_К ПАПКЕ_SDK\extras\android\support\design Помечаем библиотекой его Подключаем к основному проекту (Свойства->Android->Libraries->Add)

Ответ 2



Если вы используете AndroidStudio, то: в Gradle Scripts, в build.gradle(Module: app) добавить в dependencies compile 'com.android.support:design:хх.х.х' хх.х.х - версия твоих используемых библиотек. После - синхронизировать!

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

Смещение кнопок

#android #android_sdk #android_fragment


Есть панель, на которой находятся 3 кнопки, после какого-то события вторая кнопка
должна стать невидимой setVisibly(View.INVISIBLE), как сделать, чтобы после скрытия
второй кнопки, 3 кнопка стала на место второй, т.е. произошел сдвиг? Если есть, то
можно фрагмент кода
    


Ответы

Ответ 1



Попробуй вместо View.INVISIBLE использовать View.GONE, он в отличие от INVISIBLE обнуляет размер невидимой вьюхи.

четверг, 13 февраля 2020 г.

Передать значение boolean с одного Activity в другое Activity

#java #android #android_sdk #android_studio


Каким образом можно из одного Activity передать булево значение в другое Activity?
К примеру:

boolean playPause = false;


Во втором Activity его прочитать и изменить значение boolean на переданное? Если
возможно, пример кода.

Обновление

Если я правильно понимаю то "ловить" переданный Intent мне нужно в onCreate, но возникает
ошибка - строка   

boolean addedToFavorites = passedDate.getBoolean("addedToFavorites");


Подчёркнута красным ошибка


  (not a statement)


А  playPause в  boolean playPause неактивно. Если 

{ 
    boolean playPause = passedDate.getBoolean("playPause");
}


Беру в скобки то подчёркивание исчезает, но boolean playPause по прежнему не активно
- Variable "playPause" is never used. Как это исправить? Прошу прощение за глупый вопрос,
я только начал изучать java и android.
    


Ответы

Ответ 1



Элементарно. Когда стартуете активити: Intent intent = new Intent(this, MyActivity.class); intent.putExtra("playPause", false); startActivity(intent) Затем, чтобы получить это значение, в другом активити: Bundle passedDate = getIntent().getExtras(); if(passedDate != null) boolean playPause = passedDate.getBoolean("playPause"); Не забудьте, что получать данные вы должны по тому же ключу, что и передали. То есть, если у вас Intent.putExtra("playPause", value)", то и получать вы должны passedDate.getBoolean("playPause")

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

Как задать в GridLayout (под Android) максимальную ширину столбца?

#android #android_sdk #android_layout


Добрый день!
Пытаюсь разобраться с GridLayout. Вроде удобная штука, но...
Стоит простая задача на экран вывести 2 ImageButton, но так чтобы их размеры растягивались
самостоятельно на экране. 
По логике с этим должен справляться GridLayout. Не могу понять какое свойство настраивать...
Пока съезжают картинки, так как левая больше и сама она не уменьшается. 

P.s. размеры картинок не меняю, так как на разных устройствах размер разный, стало
быть как-то это свойствами можно сделать. Только не знаю как...







    


Ответы

Ответ 1



Тут все несколько нетривиально, хотя ничего военного. Проблема в том что GridLayout научился разбивать пропорционально (использовать вес) только с версии Android v21. К счастью GridLayout есть в support library, его только нужно подключить: для этого нужно подключить сам модуль gridlayout из каталога androidSdk/extras/android/support/v7/gridlayout, android-support-v7-gridlayout.jar который лежит в папке libs у этого модуля, и android-support-v4.jar. UPD: Если использовать Android Studio то подключить их совсем просто, в файле build.gradle у модуля app: dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:support-v4:22.0.0' compile 'com.android.support:gridlayout-v7:22.0.0' } UPD2: Также предварительно нужно в SDK Manager выкачать последние Tools (Tools, Platform-tools, Build-tools), Android SDK и Android Support Repository (в низу списка). Сам xml: