Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / девять частей экрана / 23 сообщений из 23, страница 1 из 1
30.01.2014, 08:56
    #38543056
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
привет всем

хочется поделить первую активность/экран на 9 равных частей
чтобы каждая часть была кликабельной

как так можно сделать?

применить TableLayout и в каждую ячейку вставить по кнопке?
и как сделать небольшое расстояние между кликабельными частями?

очень нужен хелп!
...
Рейтинг: 0 / 0
30.01.2014, 09:10
    #38543068
Джибс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
listview
...
Рейтинг: 0 / 0
30.01.2014, 09:12
    #38543070
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
Предлагать сделать свою view, которую можно растянуть на всю активность, не стоит? Там и нарисовать можно что угодно и тач ловить в любом месте получится.
...
Рейтинг: 0 / 0
30.01.2014, 09:12
    #38543071
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
Джибсlistview
это же список...
...
Рейтинг: 0 / 0
30.01.2014, 09:34
    #38543093
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
может тогда уж GridView ?
...
Рейтинг: 0 / 0
30.01.2014, 11:04
    #38543232
Джибс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
buyboyДжибсlistview
это же список...

если тебе просто оформить как кнопки,

от решений полно
listview
gridview
их можно программно подогнать ровно

свой контрол.
...
Рейтинг: 0 / 0
30.01.2014, 13:02
    #38543473
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
[quot Джибс]buyboyпропущено...от решений полно
пытаюсь решить задачу с помощью android:weightSum, android:layout_height="0dp" и android:layout_weight="1"
не выходит нифига

у меня на материский активити добавлен GridView
а он заполняется кнопками на основе отдельного шаблона в котором кнопка вложена в LinearLayout

мозги высохли нафик
...
Рейтинг: 0 / 0
30.01.2014, 13:07
    #38543490
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
buyboyмозги высохли нафик
нарисуй крестиками, чего тебе надо. 9 равный частей как? так
X
X
X
X
..
или так?
X X X
X X X
X X X
...
Рейтинг: 0 / 0
30.01.2014, 13:09
    #38543496
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
chpashaX X X
X X X
X X X
...
Рейтинг: 0 / 0
30.01.2014, 13:18
    #38543524
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
вот исходники

activity_main =
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1.0"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#81bbd1"
        android:numColumns="3" >
    </GridView>

</LinearLayout>



item =
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="#a70000"
        android:textColor="#ffffff"
        android:text="Button" />

</LinearLayout>



java =
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class MainActivity extends Activity {
	
	GridView gvMain;
	ArrayAdapter<String> adapter;		

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Resources res = getResources();
		String[] data = res.getStringArray(R.array.labels);
        adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.button1, data);
        gvMain = (GridView) findViewById(R.id.gridView1);
        gvMain.setAdapter(adapter);		
	}

}



screen =
...
Рейтинг: 0 / 0
30.01.2014, 13:19
    #38543529
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
а надо, чтобы эти девять кнопок заполнили весь экран как по высоте так и по ширине
...
Рейтинг: 0 / 0
30.01.2014, 13:25
    #38543539
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
подойдет что угодно. 2 варианта уже сказали, TableLayout и GridView. Есть еще самый продвинутый GridLayout - он наиболее гибок в настройке, но в отличии от GridView, в нем надо каждую ячейку описывать отдельно. что конкретно не выходит?
...
Рейтинг: 0 / 0
30.01.2014, 13:27
    #38543543
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
а, понял, что не выходит
...
Рейтинг: 0 / 0
30.01.2014, 13:34
    #38543558
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
Например (погуглив "крестики нолики андроид код"), тут реализовано так:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/main_l"
    android:gravity="center"
    >
</TableLayout>



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        layout = (TableLayout) findViewById(R.id.main_l);
        buildGameField();
    }

    private void buildGameField() {
        Square[][] field = game.getField();
        for (int i = 0, lenI = field.length; i < lenI; i++ ) {
            TableRow row = new TableRow(this); // создание строки таблицы
            for (int j = 0, lenJ = field[i].length; j < lenJ; j++) {
                Button button = new Button(this);
                buttons[i][j] = button;
                button.setOnClickListener(new Listener(i, j)); // установка слушателя, реагирующего на клик по кнопке
                row.addView(button, new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,
                        TableRow.LayoutParams.WRAP_CONTENT)); // добавление кнопки в строку таблицы
                button.setWidth(107);
                button.setHeight(107);
            }
            layout.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT,
                    TableLayout.LayoutParams.WRAP_CONTENT)); // добавление строки в таблицу
        }
    }



Хотя, размеры кнопок по-хорошему нужно рассчитывать.
...
Рейтинг: 0 / 0
30.01.2014, 13:34
    #38543559
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
Исходники.
...
Рейтинг: 0 / 0
30.01.2014, 13:46
    #38543589
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
унаследуйся от ArrayAdapter, переопредели метод getView и модифицируй в нем высоту контрола (вычислив ее из расчета общей доступной высоты экрана)
как-то так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
new ArrayAdapter<String>(context, ...) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                view.getLayoutParams().height = X;
                return view;
            }
        };
...
Рейтинг: 0 / 0
30.01.2014, 15:17
    #38543752
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
вот этот код почти устраивает, только кнопки не хотят прижиматься друг к другу вплотную и нижний ряд почему-то имеет меньшую высоту=
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
public class MainActivity extends Activity {
	
	RelativeLayout rv;
	
	TableLayout layout;
	
	 final static int AMOUNT = 9;
	 final static int ROW = 3;
	 
	 float widthButt;
	 float heightButt;

	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Display display = getWindowManager().getDefaultDisplay();
		Point size = new Point();
		display.getSize(size);
		
		int dpX = (int)(size.x*getResources().getDisplayMetrics().density);
		int dpY = (int)(size.y*getResources().getDisplayMetrics().density);
		
		widthButt = dpX / ROW;
		heightButt = dpY / ROW;
		
		layout = (TableLayout) findViewById(R.id.main_tab);        
        rv = (RelativeLayout)findViewById(R.id.main_rv);
        
        TableRow row1 = (TableRow)findViewById(R.id.tableRow1);
        TableRow row2 = (TableRow)findViewById(R.id.tableRow2);
        TableRow row3 = (TableRow)findViewById(R.id.tableRow3);
       
        
        for(int i = 0; i < AMOUNT; i++) {
        	Button button = new Button(this);
        	button.setText(Integer.toString(i));
            button.setWidth((int)widthButt);
            button.setHeight((int)heightButt);          
        	
        	TableRow row = new TableRow(this);
        	if(i == 0 || i == 1 || i == 2) {
        		row1.addView(button);
        	} else if(i == 3 || i == 4 || i == 5) {
        		row2.addView(button);
        	} else if(i == 6 || i == 7 || i == 8) {
        		row3.addView(button);
        	}

        }

	}

}



скрин =
...
Рейтинг: 0 / 0
30.01.2014, 16:54
    #38543927
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
Что-то странное ты хочешь...

MyTableView
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
package ru.wadman.testapp;

import android.view.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Color;
import android.graphics.Rect;
import android.view.MotionEvent;

public class MyTableView extends View implements View.OnTouchListener {

    final int amount = 3;
    private int isClicked = -1;

    public MyTableView(Context context) {
        super(context);
        setOnTouchListener(this);
    }

    public boolean onTouch (View v, MotionEvent event) {
        final int buttonHeight = (int)getHeight() / amount;
        final int buttonWidth = (int)getWidth() / amount;

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // нажали
            isClicked = (int)((event.getX() / buttonWidth) + (event.getY() / buttonHeight)*amount)-1;
            invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            // отпустили
            isClicked = -1;
            invalidate();
            return true;
        }

        return false;

    }

    @Override
    protected void onDraw(Canvas canvas){
        final int buttonHeight = (int)getHeight() / amount;
        final int buttonWidth = (int)getWidth() / amount;

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);

        paint.setColor(Color.WHITE);
        canvas.drawPaint(paint);

        for (int i = 0; i < amount*amount; i++) {
            Rect rect = new Rect();
            rect.left = (i % amount)*buttonWidth;
            rect.top = (int)(i / amount)*buttonHeight;
            rect.right = rect.left+buttonWidth;
            rect.bottom = rect.top+buttonHeight;
            final String text = Integer.toString(i+1);
            if (i == isClicked) {
                paint.setColor(Color.CYAN);
            } else {
                paint.setColor(Color.LTGRAY);
            }
            canvas.drawRect(rect, paint);

            paint.setColor(Color.BLACK);
            paint.setTextSize(25);
            canvas.drawText(text, rect.left + (int)((rect.width() - paint.measureText(text)) / 2), rect.top + (int)((rect.height() - paint.getTextSize()) / 2), paint);
        }

    }

}



MainActivity
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
package ru.wadman.testapp;

import android.os.Bundle;
import android.view.Menu;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            MyTableView m = new MyTableView(this);
            setContentView(m);
        }
     
}



На картине нажато на "1", если отпустить, то "засереет", как и все.
...
Рейтинг: 0 / 0
30.01.2014, 17:07
    #38543946
Gwa
Gwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
>>вот этот код почти устраивает,
>> только кнопки не хотят прижиматься друг к другу вплотную и
>> нижний ряд почему-то имеет меньшую высоту=

buyboy,
Потому что когда берёте высоту нужно вычесть высоту заголовка.
или создавать Activity без заголовка
...
Рейтинг: 0 / 0
30.01.2014, 17:16
    #38543958
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
GwaПотому что когда берёте высоту нужно вычесть высоту заголовка.
или создавать Activity без заголовка

не только это. в коде есть принципиальная ошибка (в данном случае на эмулятор видимо 1 dp = 1 px из-за того, что плотность 160dpi и потому ошибка не проявилась пока). если запустить на устройстве с более крупным dpi расчет высоты станет в принципе не верен т.к. размер экрана определяется как dp, а высота вьюх должна задаваться в пикселах.
...
Рейтинг: 0 / 0
30.01.2014, 17:19
    #38543964
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
chpashaне только это. в коде есть принципиальная ошибка (в данном случае на эмулятор видимо 1 dp = 1 px из-за того, что плотность 160dpi и потому ошибка не проявилась пока). если запустить на устройстве с более крупным dpi расчет высоты станет в принципе не верен т.к. размер экрана определяется как dp, а высота вьюх должна задаваться в пикселах.

а не пардон, все правильно - реальный размер в пикселах вычисляется, меня названия переменных dpX и dpY ввели в заблуждение.
...
Рейтинг: 0 / 0
31.01.2014, 08:21
    #38544469
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
GwaПотому что когда берёте высоту нужно вычесть высоту заголовка. или создавать Activity без заголовка
супер! архиспасибо!

реализовал так =

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
clearYSize = size.y - getTitleBarHeight();

public int getStatusBarHeight() {
	Rect r = new Rect();
	Window w = getWindow();
	w.getDecorView().getWindowVisibleDisplayFrame(r);
	return r.top;
}

 
public int getTitleBarHeight() {
	int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
	return (viewTop - getStatusBarHeight());
}
...
Рейтинг: 0 / 0
31.01.2014, 08:23
    #38544470
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
девять частей экрана
wadman,
не странное хочу, а скорее странно реализую свои хотелки :))
большое спасибо за код!
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / девять частей экрана / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]