Страницы

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

среда, 29 мая 2019 г.

Библиотека совместимости фрагментов

Вопрос уточняющий. Фрагменты появились в 3й версии Андроид API 11, ориентируюсь я на пользователей начиная с API 15 и выше. Значит не нужно использовать android.support.v4.app.Fragment? Эта либа для поддержки фрагментов в версиях ниже 3, так же ведь?)


Ответ

Если хотите использовать все современные возможности фрагментов, исправления и максимально одинаковое поведение на разных версиях андройда, то лучше использовать фрагменты и библиотеки поддержки. Смысл использовать родные фрагменты есть, только если у вас довольно маленькое приложение и вы хотите сделать его макимально маленьким). Нынче даже сама Android Studio по умолчанию при создании нового проекта с активити и фрагментами использует таковые из сапорт либы.

Как правильно объединить два столбца и сделать по нему JOIN

Всем привет! У меня есть две таблицы: Мои друзья(friends): id, user1_id, user2_id, joined Пользователи(users): id, name, sename
Хочу достать значение из поля user1_id и user2_id объединить их в один столбец, и уже по этому столбцу сделать INNER JOIN с таблицей users.
С объединением проблем не возникло, делаю так:
SELECT user1_id as friend_id, joined FROM friends WHERE user2_id = 7 #Выбираем всех друзей пользователя из второй колонки UNION SELECT user2_id, joined FROM friends WHERE user1_id = 7 #Выбираем всех друзей пользователя из первой колонки
А вот JOIN никак не могу подружить с union. Делаю так:
SELECT users.*, friends.user1_id as friend_id, friends.joined FROM users INNER JOIN friends ON friends.friend_id = users.id WHERE friends.user2_id = 7 UNION SELECT user2_id, joined FROM friends WHERE user1_id = 7
В двух словах: Друзья пользователя могут находится в колонке friends.user1_id или friends.user2_id, чтобы упростить запрос я хочу объединить эти две колонки и уже по этой колонке достать нужных пользователей из таблице users.


Ответ

SELECT users.*, friend_id, joined FROM( SELECT user1_id as friend_id, joined FROM friends WHERE user2_id = 7 #Выбираем всех друзей пользователя из второй колонки UNION SELECT user2_id, joined FROM friends WHERE user1_id = 7 #Выбираем всех друзей пользователя из первой колонки )friends INNER JOIN users ON friends.friend_id = users.id

В чем разница SQLiteOpenHelper и SQLiteDatabase?

Начал пробовать работать с БД и вот такой вопрос получился)
Немного посерфил и насколько понял, то SQLiteOpenHelper расширяет SQLiteDatabase, но и чет там еще... Но поскольку всего час разбираюсь в этом, то решил узнать что для чего?


Ответ

Для работы вам скорее всего нужен будет именно SQLiteOpenHelper , т.к. SQLiteDatabase финальный класс. В классе который наследуется от SQLiteOpenHelper вы переопределите методы onCreate() и onUpgrade()
В onCreate() - вы создаете таблици в БД. В onUpgrade() - вы можете изменить версию БД, если, например добавили новые модели в БД.
Ну это так... коротко!

Query Syntax против Method Syntax в LINQ

Во время написания LINQ-запроса чем необходимо руководствоваться при выборе стиля написания запроса? Использовать синтаксис запроса (Query Syntax) или метода (Method Syntax)? Что лучше использовать?
На мой взгляд методы удобнее и писать и читать, чего не скажешь про синтаксис запроса. В каких случаях необходимо использовать синтаксис запроса, а в каких синтаксис метода?
Очень хотелось бы узнать подробнее и с примерами, когда и чем лучше тот или иной подход написания запроса. Из этой статьи Query Syntax and Method Syntax in LINQ (C#) почему-то не все понял, да и есть места, где мое мнение отличается.


Ответ

Длинные и сложные запросы в синтаксисе методов могут стать нечитаемыми - особенно при частом использовании анонимных классов. Синтаксис же запроса скрывает эти анонимные классы от вас:
var q1 = trees.SelectMany(t => t.Leaves.Select(l => new { tree = t, leaf = l })) .OrderBy(x => x.leaf.color) .Select(x => x.tree.name);
Попробуйте переписать запрос выше без анонимного класса. А ведь в более длинных запросах могут появиться уже либо вложенные анонимные классы - либо постоянные копирования из одного анонимного класса в другой.
При использовании синтаксиса запроса многие анонимные классы успешно прячутся:
var q1 = from tree in trees from leaf in tree.Leaves order by leaf.Color select tree.Name;
Также в длинных запросах при использовании методов может быстро надоесть писать один и тот же префикс для каждого замыкания - в синтаксисе запроса же range variable определяется только 1 раз.
По этой причине в сложных запросах синтаксис запроса, как правило, предпочтительнее.

С другой стороны, некоторые вещи сделать в синтаксисе запроса просто невозможно.
К примеру, перегрузки методов, принимающие IEqualityComparer, могут быть вызваны только как методы.
Также синтаксис методов позволяет "накапливать" сложный запрос в переменной в зависимости от внешних условий - что полезно при обработке блоков фильтрации:
if (filters.Foo.HasValue) q = q.Where(x => x.Foo == filters.Foo);
if (filters.Bar != null) q = q.Where(x => x.Bar.Name == filters.Bar);

Лишний отступ внизу блока, содержащего img

CSS
main div.image { display: block; width: 100%; }
main div.image img { width: 100%; height: auto; }
HTML


Проблема в том, что этот код (да даже без любого CSS, просто картинка в другом теге) добавляют дополнительное пространство снизу родительского блока.

Вы можете заметить, что сама картинка уже "закончилась", но родительскому блоку все равно снизу добавляется некоторое свободное пространство. С чем это связано и как от этого избавиться - вопрос. Хотя, может быть, это нормально и добавляется вне зависимости от моего желания, прямо как margin'ы у p. Хотя от них можно избавиться.


Ответ

Картинка, по умолчанию, отображается как строковый элемент, на который влияет высота строки. Именно высота строки ответственна за расстояние между div и img
Решения два:
Обнулить высоту строки для обертки. Сделать картинку блочным элементом.
.holder { border: 1px solid lime; outline: 1px solid #000; width: 100px; } .fix-1 { line-height: 0; } .fix-2 img { display: block; }


Как сделать инкрементирование дня месяца раз в секунду в TextView Android

Добрый вечер. Подскажите пожалуйста как написать такой счетчик, который увеличивает день месяца каждую секунду независимо сразу по создании метода onCreate.
private TextView timeDate; java.util.Date noteTS = Calendar.getInstance().getTime(); String date = "dd MMMM yyyy"; // 01 January 2013 timeDate.setText(DateFormat.format(date, noteTS));


Ответ

Следующий код будет выполнять тело метода run() каждую секунду. В нем вместо текущего времени, как в примере, вы можете выводить дату в нужном для вас формате. Так же вы можете завести переменную которую каждую секунду будете инкрементировать, в вашем случае так можно изменять значение месяца.
android.os.Handler handler = new android.os.Handler(); int i = 0; TextView textView = new TextView(this); int refreshTime = 1000; // 1 second textView.post(new Runnable() { @Override public void run() { i++; //for example you can increment value there textView.setText((int) System.currentTimeMillis()+""); handler.postDelayed(this,refreshTime); } });

Работа приложения при выключенном экране

Хотелось бы узнать, что использовать для того, чтобы приложение могло бы работать в режиме "сна" (при нажатии кнопки выключения)? Пробовал использовать класс Service, но при выключении экрана он "глохнет". Знаю, что не достает какой-то важной части (в плане разрешения доступа или чего-то подобного), но сам не смог найти. Собственно код:
public class MyService extends Service {
final String LOG_TAG = "myLogs";
@Override public IBinder onBind(Intent intent) {
return null; }
public void onCreate() { super.onCreate(); Log.d(LOG_TAG, "onCreate"); }
public int onStartCommand(Intent intent, int flags, int startId) { Log.d(LOG_TAG, "onStartCommand"); someTask(); return super.onStartCommand(intent, flags, startId); }
public void onDestroy() { super.onDestroy(); Log.d(LOG_TAG, "onDestroy"); }
public void someTask() { ...... } }
В в Main-е вызываю сервис при открытии приложения:
public class MainActivity extends AppCompatActivity { final String LOG_TAG = "myLogs";
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startService(new Intent(this, MyService.class)); }


Ответ

И это правильно. Так и задумано, чтоб при заблокированном экране батарея устройства не разряжалась.
Если, всё же, хотите, то используйте WakeLock и PowerManager
PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); wakeLock.acquire();

Как вставить видео с youtube без звука?



Ответ

Копия вопроса https://stackoverflow.com/questions/24868226/how-do-you-mute-an-embedded-youtube-player
Вот код оттуда
Нужно включить &enablejsapi=1 в url, а потом выключить с помощью JS. Сам Youtube не позволяет выключить звук.
HTML:

JS:
var player;
function onYouTubeIframeAPIReady() { player = new YT.Player('ytplayer', { events: { 'onReady': onPlayerReady } }); }
function onPlayerReady(event) { player.mute(); player.playVideo(); }

Объединение Bitmap [закрыт]

Как объединить две или более bitmap с прозрачностью в одну, в C#?


Ответ

используйте CompositingMode.SourceOver
Bitmap baseImage; Bitmap overlayImage;
baseImage = (Bitmap)Image.FromFile(@"C:\150\base.png"); overlayImage = (Bitmap)Image.FromFile(@"C:\150\tb.png");
var finalImage = new Bitmap(overlayImage.Width, overlayImage.Height, PixelFormat.Format32bppArgb); var graphics = Graphics.FromImage(finalImage); graphics.CompositingMode = CompositingMode.SourceOver;
graphics.DrawImage(baseImage, 0, 0); graphics.DrawImage(overlayImage, 0, 0);
//Отображаем изображение на форме pictureBox1.Image = finalImage;
Результат: