Ответы пользователя по тегу Android
  • Странное поведение ListView, находящегося внутри LinearLayout?

    palmut
    @palmut
    У ListView поставьте android:layout_height="0dp" и будет ожидаемый вариант. Вообще при использовании android:layout_weight у этого контрола желательно ставить android:layout_height (или соответственно android:layout_width) в 0dp. И поведение будет более предсказуемым, да и работает быстрее. А у нижнего ImageView android:layout_weight наверное совсем не нужен.
    Ответ написан
    2 комментария
  • Отладка Android-приложения по сети?

    palmut
    @palmut
    А пo TCP не лучше ли запустить отладку? Допустим, если Nexus 4 рутануть и поставить ADB over WIFI Widget, при этом WiFi у дейвайса будет иметь реальный IP (ну или прокинуть на рутере на него на заданный порт), на компьютре запустить adb connect <host>:<port>. Внутри одной сети WiFi это прекрасно работает, по идее пакеты везде одинаковые.
    Ответ написан
    Комментировать
  • Размер картинки на фон в Android-приложении?

    palmut
    @palmut
    Еще вариант — использовать библиотеку svg-android.
    Ответ написан
    Комментировать
  • GridView с квадратными ячейками?

    palmut
    @palmut
    Хм, не знаю как подцепить файл сюда. Но может быть вот такой компонент подойдет?

    public class DashboardLayout extends ViewGroup {
    	private final static String TAG = DashboardLayout.class.getName();
    
    	private final static int DEFAULT_COLUMNS = 3;
    
    	private int columns;
    
    	public DashboardLayout(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    
    		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DashboardLayout);
    
    		try {
    			setColumns(a.getInt(R.styleable.DashboardLayout_dashboardColumns, DEFAULT_COLUMNS));
    		} finally {
    			a.recycle();
    		}
    	}
    
    	public DashboardLayout(Context context, AttributeSet attrs) {
    		this(context, attrs, 0);
    	}
    
    	public DashboardLayout(Context context) {
    		this(context, null);
    	}
    
    	@Override
    	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
    		int totalChildWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
    
    		int visibleCount = getVisibleCount();
    		if (visibleCount > 0) {
    
    			int childWidth = totalChildWidth / columns;
    			int childHeight = childWidth;
    
    			int childWidthSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
    			int childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
    
    			for (int i = 0, N = getChildCount(); i < N; i++) {
    				final View child = getChildAt(i);
    				if (child.getVisibility() != View.GONE) {
    					child.measure(childWidthSpec, childHeightSpec);
    				}
    			}
    		}
    
    		setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    	}
    
    	@Override
    	protected void onLayout(boolean changed, int l, int t, int r, int b) {
    
    		int childLeft = l + getPaddingLeft();
    		int childTop = t + getPaddingTop();
    
    		for (int i = 0, N = getChildCount(); i < N; i++) {
    			final View child = getChildAt(i);
    			if (child.getVisibility() != View.GONE) {
    				child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(),
    								childTop + child.getMeasuredHeight());
    
    				childLeft += child.getMeasuredWidth();
    				if (childLeft + getPaddingRight() >= r) {
    					childLeft = l + getPaddingLeft();
    					childTop += child.getMeasuredHeight();
    				}
    			}
    		}
    
    	}
    
    	/***
    	 * Set number of columns. By default DashboardLayout uses 3 columns
    	 * 
    	 * @param value
    	 *            - number of columns
    	 */
    	public void setColumns(int value) {
    		if (value != columns) {
    			columns = value;
    			requestLayout();
    		}
    	}
    
    	/***
    	 * Returns number of columns.
    	 * 
    	 * @return number of columns
    	 */
    	public int getColumns() {
    		return columns;
    	}
    
    	private int getVisibleCount() {
    		int count = 0;
    		for (int i = 0, N = getChildCount(); i < N; i++) {
    			if (getChildAt(i).getVisibility() != GONE) count++;
    		}
    
    		return count;
    	}
    
    }
    
    


    Еще надо положить в res/values/attr.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <declare-styleable name="DashboardLayout">
            <attr name="dashboardColumns" format="integer" />
        </declare-styleable>
    
    </resources>
    
    Ответ написан
    1 комментарий
  • Как добавить футер в GridView?

    palmut
    @palmut
    В посте, на который указал есть вот такая часть:

    mList.setOnScrollListener(new OnScrollListener() {
    
            @Override
            public void onScrollStateChanged(AbsListView arg0, int arg1) {}
                
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    if (visibleItemCount > 0 && firstVisibleItem + visibleItemCount == totalItemCount &&
                                hasNextPage()) {
                        loadNextPage();
                    }
                }
        });
    
    Ответ написан
    1 комментарий
  • Как добавить футер в GridView?

    palmut
    @palmut
    На всю ширину можно сделать, если бы был GridLayout… Один из вариантов, который пришел в голову, это показывать отдельно компонент загрузки вне GridView. Т.е. положить GridView и вот этот компонент загрузки в FrameLayout, установить свой наблюдатель setOnScrollListener(AbsListView.OnScrollListener l) и при появлении последнего элемента (который сейчас подменяемый View) управлять видимостью и высокой компонента, показывающего загрузку — координаты компонента по вертикали брать от подменяемого View. Чуть-чуть этот метод упоминается тут habrahabr.ru/post/130319/
    Ответ написан
    3 комментария
  • SetAnimation + setVisibility не работает на Android 4?

    palmut
    @palmut
    Может стоит в animation установить Animation.AnimationListener и перенести buttonsBar.setVisibility(View.VISIBLE); в onAnimationEnd?
    Ответ написан
  • «Android — делаем фото» возвращает resultCode=-1 и data=null — день назад было все в порядке!?

    palmut
    @palmut
    Поясните пожалуйста вопрос. Вы делаете фото, Вам возвращается ответ. При этом resultCode = -1 (что есть RESULT_OK), а data = null, что тоже есть правильно, поскольку при вызове явно указали куда сохранять имидж. Вроде все в порядке — картинка будет в imageOrVideoUri и проверку &&(data != null) надо просто убрать. По документации, если указывается MediaStore.EXTRA_OUTPUT, то там будет полноразмерный снимок, если не указывается — то в data будет Bitmap маленького размера. Или я что-то не так понял?
    Ответ написан
    3 комментария
  • «Android — делаем фото» возвращает resultCode=-1 и data=null — день назад было все в порядке!?

    palmut
    @palmut
    Что-то непонятно в начале takePicture:
    private void takePicture() {
            Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    ...
    

    Вроде собираетесь делать фото, а в интент передаете ACTION_VIDEO_CAPTURE. Может в этом дело?
    Ответ написан
  • 2 линии в ActionBarSherlock?

    palmut
    @palmut
    К сожалению у Вас не получится это сделать — в layout жестко прописан для title в атрибутах singleLine = «true», а вторая строка используется для subtitle. Вы можете либо использовать subtitle для второй строки, или помещать на ABS свой TextView через setCustomView.
    Ответ написан
    Комментировать
  • Как написать, чтобы программа отправляла запрос по заданному адресу сайта, получала xml файл и извлекала из него данные?

    palmut
    @palmut
    Вопрос из разряда — как написать программу для Android. :)

    Схема такова:
    1. Формируем запрос
    2. Если удачно — запускаем парсер
    3. Возвращаем данные

    Сам процесс хорошо бы запускать не в UI треде, т.е. надо использовать Thread, AsyncTask или AsyncTaskLoader (от ситуации зависит).

    Выглядит примерно так:
    	private void downloadContent() {
    		HttpURLConnection connection = null;
    		BufferedInputStream ins = null;
    		String urlString = "<заданный адрес сайта>";
    
    		try {
    			URL url = new URL(urlString);
    
    			connection = (HttpURLConnection) url.openConnection();
    			int status = connection.getResponseCode();
    			if (status == HttpURLConnection.HTTP_OK) {
    				XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
    				ins = new BufferedInputStream(connection.getInputStream());
    				parser.setInput(ins, null);
    				parseData(parser);
    			}
    
    		} catch (Exception e) {
    			// надо обработать исключение
    		} finally {
    			if (ins != null) {
    				try {
    					ins.close();
    				} catch (IOException e) {}
    			}
    		}
    
    	}
    	
    	public void parseData(XmlPullParser parser) throws XmlPullParserException, IOException {
    
    		int eventType = parser.getEventType();
    		final String xmlTag = "rootTAG";
    
    		do {
    			if (eventType == XmlPullParser.START_TAG) {
    				String name = parser.getName();
    				if (xmlTag.equalsIgnoreCase(name) && (parser.getAttributeCount() > 0)) {
    					for (int i = 0, N = parser.getAttributeCount(); i < N; i++) {
    						// парсим атрибуты
    						parseAttribute(parser.getAttributeName(i), parser.getAttributeValue(i));
    					}
    				}
    				// парсим вложенный таг
    				parseTag(parser);
    			}
    			eventType = parser.next();
    		} while (!(eventType == XmlPullParser.END_TAG && xmlTag.equals(parser.getName()))
    						&& (eventType != XmlPullParser.END_DOCUMENT));
    
    	}
    
    


    Задавайте вопросы — раскрою тему.
    Ответ написан
    Комментировать
  • Что почитать android разработчику?

    palmut
    @palmut
    Ответ написан
    Комментировать
  • Список полезных сайтов для Android-разработчиков?

    palmut
    @palmut
    Еще вот тут есть полезные примеры и советы blog.stylingandroid.com/.
    Сайт для генерации ресурсов (цвета, иконки и другое) android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html. Очень часто пользуюсь.
    Ответ написан
    Комментировать
  • Один класс парсера для разных активити?

    palmut
    @palmut
    Лучше перейти от активити к фрагментам. Загрузку и парсинг данных сделать через наследника Loader. Тогда загрузка и парсинг данных (Loader и класс для парсинга) отделяется от отображения — фрагменты (и возможно адаптеры в случае ListView).
    Ответ написан
    5 комментариев
  • Смещение координаты Y при передаче из UI потока?

    palmut
    @palmut
    Попробуйте еще умножить getX() и getY() на getXPrecision() и getYPrecision() соответственно, поскольку эти функции возвращают the precision of the Y coordinates being reported. You can multiply this number with getY() to find the actual hardware value of the Y coordinate. (цитата из документации MotionEvent).
    Ответ написан
    Комментировать
  • SurfaceView в layout?

    palmut
    @palmut
    А разве
    SurfaceView view = (SurfaceView) findViewById(R.id.surfaceView1); 
    

    не сработает?
    Ответ написан
    Комментировать
  • Текстовый редактор/просмотрщик для кода под Android?

    palmut
    @palmut
    AIDE — Android Java IDE не подходит? И на телефоне и на планшете отлично все показывает. Различные варианты просмотра. Да и проект можно подправить, скомпилировать и запустить. <a =href«play.google.com/store/apps/details?id=com.aide.ui»>ссылка на Google Play
    Ответ написан
    Комментировать
  • Очень медленно парсится XML под Aндроидом

    palmut
    @palmut
    Попробуйте лучше использовать XMLPullParser. Работает в разы быстрее.
    Ответ написан
    Комментировать
  • Анимация в HTML5 Canvas на Android Default Browser

    palmut
    @palmut
    Nexus One с Android 2.3.6 — все отлично, только остановка движения происходит, если вести пальцем по экрану.
    Acer Iconia A500 c Android 3.2.1 все плавно, но если сделать большой зум, то начинает подтормаживать, также останавливается, если вести пальцем по экрану.
    Ответ написан
    Комментировать
  • Разработка под Android: как сделать Activity по типу Настройки -> О телефоне -> Общая информация?

    palmut
    @palmut
    А вот такой вариант не подойдет?

    Это код активити:
    public class TestActivity extends ListActivity {
    
    	private final static String TITLE_KEY = "title";
    	private final static String DESCRIPTION_LEY = "description";
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		List<Map<String, String>> data = new ArrayList<Map<String, String>>();
    		int count = 10;
    		for (int i = 1; i <= count; i++) {
    			final HashMap<String, String> item = new HashMap<String, String>();
    			item.put(TITLE_KEY, String.format("Title %d", i));
    			item.put(DESCRIPTION_LEY, String.format("Description %d", i));
    			data.add(item);
    		}
    
    		setListAdapter(new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[] { TITLE_KEY,
    						DESCRIPTION_LEY }, new int[] { android.R.id.text1, android.R.id.text2 }));
    	}
    
    }
    


    А это код лейаута mail.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1" />
    
        <TextView
            android:id="@android:id/empty"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="No data" />
    
    </LinearLayout>
    
    Ответ написан
    2 комментария