Ответы пользователя по тегу Android
  • Как правильно верстать android ui?

    Вот посмотрите:
    awesome-android-ui
    Ответ написан
    Комментировать
  • Яндекс карты, как сохранить маршрут между точками?

    Так вы используете Yandex map kit или обычные карты yandex через webview? Если первое, то прокладывать маршрут не умеет, если второе то юзайте yandex route, он как раз и занимается прокладкой маршрутов.
    Ответ написан
    Комментировать
  • Webview: Как отключить увеличение масштаба при двойном тапе?

    Можно вот так:
    webView.getSettings().setUseWideViewPort(false);
    Тогда правда любой зум отключится. А можно при помощи реализации интерфейса GestureDetector.OnDoubleTapListener :
    ...
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return false;
        }
    
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            //Тут вернем true, тем самым игнорим двойной клик
            return true;
        }
    
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            return true;
        }
    Ответ написан
  • Почему приложение крашится если дважды включить/выключить GPS?

    Во фрагменте вы можете отловить готовность activity в событии onAttach именно тут активность связывается с фрагментом и после чего вы можете без зазрения совести юзать getActivity. Соответственно вы можете либо биндить свой листер после события onAttach либо в нем, или создать флаг, который будет указывать на готовность активности и проверять его значение при вызове checkEnabled.
    Ответ написан
    Комментировать
  • Android и отслеживание местоположения?

    Для определения местоположения вы можете использовать как стандартный requestLocationUpdate, так и Fused Location Provider, который является частью api Google play services. Плюсами решения на основе Fused Location Provider является то, что вам не надо самому подыскивать наиболее точный источник координат, он сделает это за вас. Если запускать его с критериями для определения наиболее точного местоположения, то он будет работать по следующему принципу:
    1) Если GPS доступен и включен, то выбирается GPS_PROVIDER в качестве источника.
    2) Если GPS недоступен то выбирается NETWORK_PROVIDER. В данном случаи координаты определяются при помощи вышек сотовой связи и WIFI.
    3) Если не того не другого нет то используется PASSIVE_PROVIDER. Тут система пытается использовать любой способ получить хоть какое-то местоположение в том числе и при использовании акселерометра. Этот провайдер наименее точный.

    Так вот Fused Location Provider включает в себя все три и переключается между ними в зависимости от ситуации для получения наиболее точного место положения, так же при его использовании заряд батареи жрется медленнее. Его главными минусами является то, что для его работы необходим Google play services и то, что вы не сможете отследить какой именно тип провайдера используется в данный момент.

    Что касается стандартного LocationManager, то вам придется самому определять какой провайдер использовать и переключаться между ними в ручную. В общем все делать ручками. Плюсом является то, что вы полностью контролируете весь процесс.
    От себя добавлю что я юзал Fused Location Provider и работает он просто замечательно, главное чтобы его версия была 7 и выше, на 6 давал сильный разброс по координатам.
    Ответ написан
    Комментировать
  • SignActivity and back stack.....?

    Вообще вы можете использовать при старте новой activity флаг FLAG_ACTIVITY_CLEAR_TOP:
    Intent intent = new Intent(getBaseContext(), NewActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();

    Флаг FLAG_ACTIVITY_CLEAR_TOP как раз и позволит при открытии новой активности очистить стек.
    Ответ написан
    1 комментарий
  • ObjectAnimator - можно ли указать значения в процентах в xml?

    Вообще ObjectAnimator жрет процентные значения, но для этого вам самому придется реализовать ф-и установки и получения значений для анимации. Например надо изменить длину FrameLayout с 0 до 25% от размера экрана, тогда будет что-то типо этого:
    public class SlidingFrameLayout extends FrameLayout
    {
        private static final String TAG = SlidingFrameLayout.class.getName();
    
        public SlidingFrameLayout(Context context) {
            super(context);
        }
    
        public SlidingFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public float getXFraction()
        {
            int width = getWindowManager().getDefaultDisplay().getWidth();
            return (width == 0) ? 0 : getX() / (float) width;
        }
    
        public void setXFraction(float xFraction) {
            int width = getWindowManager().getDefaultDisplay().getWidth();
            setX((width > 0) ? (xFraction * width) : 0);
        }
    }

    После этого в xml-ке можно писать так:
    <objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="xFraction" 
    android:valueType="floatType"
    android:valueFrom="0"
    android:valueTo="0.25" 
    android:duration="500"/>
    Ответ написан
  • Как перенаправить на другую страницу с помощью jsoup и продолжать выводить содержание контента в ListView?

    Не особо понятно зачем же вам понадобилось выводить их все на одной страницы, но для этого вам просто надо спарсить все страницы указанные в пагинации по очереди. Самое простое это поступить как-то так:
    titleList.clear();
    for (int i = 1; i <= 1683; i++) {
        doc = Jsoup.connect("/page/" + i).get();
        content = doc.select("[style=margin:0.5em 0;line-height:1.785em]");
    
        for (Element contents : content) {
            if (!contents.text().contains("18+")) {
                titleList.add(contents.text());
            }
        }
    }

    Для динамической подгруздки вы можите воспользоваться AbsListView. Во первых мы можете там отлавливать событие скролла, а так же получать кол-во видимых элементов.
    public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
        private int bufferItemCount = 10;
        private int currentPage = 0;
        private int itemCount = 0;
        private boolean isLoading = true;
    
        public InfiniteScrollListener(int bufferItemCount) {
            this.bufferItemCount = bufferItemCount;
        }
       
        public abstract void loadMore(int page, int totalItemsCount);
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
        {
            if (totalItemCount < itemCount) {
                this.itemCount = totalItemCount;
                if (totalItemCount == 0) {
                    this.isLoading = true; }
            }
    
            if (isLoading && (totalItemCount > itemCount)) {
                isLoading = false;
                itemCount = totalItemCount;
                currentPage++;
            }
    
            if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
                loadMore(currentPage + 1, totalItemCount);
                isLoading = true;
            }
        }
    }

    Ну и к цепляете это к вашему списку:
    myListView.setOnScrollListener(new InfiniteScrollListener(5) {
        @Override
        public void loadMore(int page, int totalItemsCount) {
            doc = Jsoup.connect("/page/" + page).get();
            content = doc.select("[style=margin:0.5em 0;line-height:1.785em]");
    
            for (Element contents : content) {
                if (!contents.text().contains("18+")) {
                    titleList.add(contents.text());
                }
             }
            //Обновляем список
            adapter.notifyDataSetChanged();
        }
    });

    Все должно работать. Так же есть готовые решения типо вот этого.
    Ответ написан
    3 комментария
  • Можно ли на один Button назначить несколько команд?

    Если я правильно понимаю что вам нужно, то можно конечно создать внешнюю переменную и используйте её вместо флага, вроде этого:
    private int state = 0;
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (state == 0) {
                 //показываем первый кусок
                 state = 1;
             }
             else if (state == 1) { 
                 //показываем второй кусок
                 state = 2
              }
              else {
                  //тут действие по умолчанию
              }
        }
    });
    Ответ написан
  • Как обновлять время в приложении?

    Вот так например, если ни чего не напутал:
    Timer myTimer = new Timer(); 
    final Handler uiHandler = new Handler();
    final TextView txtResult = (TextView) findViewById(R.id.вашid);
    myTimer.schedule(new TimerTask() { 
        @Override
        public void run() {
            Calendar calendar = Calendar.getInstance();
    	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a", Locale.getDefault());
    	final String strDate = simpleDateFormat.format(calendar.getTime());
    
            uiHandler.post(new Runnable() {
                @Override
                public void run() {
                    txtResult.setText(strDate);
                }
            });
        });
    }, 5000);
    Ответ написан
    3 комментария