Как добавить пользовательское представление в Android? - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть представление графика (пользовательский вид) в Android и основной вид. В зависимости от предпочтений пользователя я хочу добавить 1-5 видов графиков на мой основной вид, но не совсем уверен, как это сделать. (Я использую исключительно Java, а не XML). Я читал, что мне, возможно, придется использовать Относительную компоновку или что-то еще, чтобы составлять представления.

Любые советы или предложения приветствуются

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

в вашей деятельности у вас, вероятно, есть что-то вроде этого в начале вашего метода onCreate ():

setContentView(R.layout.main);

внутри вашего файла main.xml у вас, вероятно, есть элемент, который является своего рода макетом.Я пока предполагаю LinearLayout, но он работает одинаково со всеми типами.Вам нужно будет получить ссылку на этот макет и сделать это, чтобы он имел идентификатор.Поэтому, если в этом макете нет чего-то подобного, вам нужно добавить его:

android:id="@+id/myMainLayout"

Затем, вернувшись в Java, через некоторое время после вызова setContentView () вы можете найти ссылку на свой макет с помощьючто-то вроде этого:

LinearLayout myLayout = (LinearLayout)findViewById(R.id.myMainLayout);

Когда у вас есть ссылка на ваш макет, вы можете добавить к нему виды графиков примерно так:

myLayout.addView(graph1);
myLayout.addView(graph2);
//etc...

Если вы хотите пропустить xmlмакет все вместе вы можете сделать свой макет в Java.Для этого ему нужно:

LinearLayout myLayout = new LinearLayout(YourActivity.this);
myLayout.addView(graph1);
myLayout.addView(graph2);
setContentView(myLayout);

Обратите внимание, что вы можете вызывать setContentView () только один раз, поэтому вам нужно будет передать ему какой-то тип макета, если вы хотите добавить более 1 вида.

Редактировать:

Я никогда специально не пробовал, но я думаю, вы могли бы вызвать addView () из конструктора в своем пользовательском представлении:

public CustomView() {
    this.addView(anotherView);
}

у вас естьпользовательский вид для вашего макета тоже?

1 голос
/ 03 сентября 2011

Вот пример пользовательского представления в виде графика. Нужно иметь LinearLayout где-то в макете, у которого ID установлен в @ + id / ll и размер графика:

public class RootActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    int[] graphData = {3,5,2,7,4,8,1,5,9};

    LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
    GraphView graphView = new GraphView(this);
    ll.addView(graphView);


    //call this method with every new set of data
    graphView.drawGraph(graphData);


}


class GraphView extends View{
 int[] graphData;
 Paint graphPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 int screenH;
 int screenW;
 int colW;
 int colH;
 int columnCount;

 public GraphView(Context context) {
    super(context);

    graphPaint.setColor(Color.MAGENTA);
    graphPaint.setStyle(Style.FILL);
}


 @Override     
 public void onSizeChanged (int w, int h, int oldw, int oldh) {         
     super.onSizeChanged(w, h, oldw, oldh);         
     screenW = w;         
     screenH = h; 
 }


public void drawGraph(int[] graphData){
    this.graphData = graphData;
    columnCount = graphData.length;
    invalidate();
}


@Override     
public void onDraw(Canvas canvas) {         
    super.onDraw(canvas); 

    colW = (screenW - 10) / columnCount;
    int graphStep = 20;
    int columnSpace = 5;

    canvas.drawText("GRAPH", 10, 10,  graphPaint);

    for (int i= 0 ; i < columnCount; i++){
        //draw columns from bottom up
        canvas.drawRect(
                new Rect(
                i * colW + 5, 
                screenH - 5 - (graphData[i] * graphStep), 
                i * colW + 5 + colW - columnSpace, 
                screenH - 5     
                ), 
                graphPaint);
    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...