2013-09-15 3 views
3

Привет Я занимаюсь практическим проектом, который мог бы нарисовать линию с координатами, которые я положил. На экране есть только два текстовых поля и одна кнопка. Например, если я помещаю «20» и «30» в эти два текстовых поля и нажимаю кнопку «нарисовать», я хочу, чтобы приложение рисовало строку от (0,0) до (20,30) в ДРУГОЙ ПРОСМОТРЕ. Проблема в том, что когда я нажимаю кнопку, значения в этих двух текстовых поля передаются в функцию setCoordinates(), но в представлении просто не отображается строка. Я попытался изменить координаты [0] и координаты [1] на 50 и 50 в функции canvas.drawLine(), после чего появится строка, поэтому, я думаю, может быть функция invalidate() не работает? В любом случае, пожалуйста, помогите найти, где моя проблема, спасибо !!!!! Вот мой код:Android - invalidate(), но просмотр не обновляется

MazeBuilder.java

package com.example.maze; 

import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.app.Activity; 
import android.graphics.Color; 

public class MazeBuilder extends Activity { 

private DrawMaze drawMaze ; 
private EditText editTextX; 
private EditText editTextY; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    drawMaze = new DrawMaze(this); 
    setContentView(R.layout.activity_maze_builder); 
    editTextX = (EditText) findViewById(R.id.editText1); 
    editTextY = (EditText) findViewById(R.id.editText2); 



} 

public void buildMaze(View view){ 

    final int x = getValue(editTextX); 
    final int y = getValue(editTextY); 

    drawMaze.setCoordinates(x, y); 

} 

private static int getValue (EditText text) { 
    try { 
     return Integer.parseInt(text.getText().toString()); 
    } catch (NumberFormatException ex) { 
     return 0; 
    } 
} 

} 

DrawMaze.java

package com.example.maze; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.View; 

public class DrawMaze extends View{ 

private Paint paint = new Paint(); 

private int[] coordinates = new int[2]; 

//===============================Constructors============================================== 
// 
// 
public DrawMaze(Context context) { 

    super(context); 

} 

public DrawMaze(Context context, AttributeSet attrs) { 

    super(context, attrs); 
} 

public DrawMaze(Context context, AttributeSet attrs, int defStyle) { 

    super(context, attrs, defStyle); 
} 

//===============================Initialize the color of line and background========================================== 
// 
//  
public void init(){ 

    paint.setColor(Color.BLACK); 
    this.setBackgroundColor(Color.WHITE); 
} 

public void setCoordinates(int x, int y){ 
    coordinates[0] = x; 
    coordinates[1] = y; 

    invalidate(); 
} 

@Override 
protected void onDraw(Canvas canvas) { 

    System.out.println("=============coordinates[0]:"+coordinates[0]+"================coordinates[1]:"+coordinates[1]+"========"); 
    canvas.drawLine(0, 0, coordinates[0] , coordinates[1] , paint); 
} 



} 

activity_maze_builder.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
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=".MazeBuilder" > 

<com.example.maze.DrawMaze 

    android:id="@+id/relativeLayout2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/relativeLayout1" /> 



<RelativeLayout 
    android:id="@+id/relativeLayout1" 
    android:layout_width="500dp" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/editText2" 
     android:layout_alignBottom="@+id/editText2" 
     android:layout_centerHorizontal="true" 
     android:text="Columns: " 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <EditText 
     android:id="@+id/editText2" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toLeftOf="@+id/button1" 
     android:ems="10" > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/editText2" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:onClick="buildMaze" 
     android:text="Build" /> 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toLeftOf="@+id/textView1" 
     android:ems="10" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/editText1" 
     android:layout_alignBottom="@+id/editText1" 
     android:layout_toLeftOf="@+id/editText1" 
     android:text="Rows: " 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

</RelativeLayout> 

+0

вместо drawMaze = new DrawMaze (this); попробуйте drawMaze = (DrawMaze) findViewById (R.id.relativeLayout2); но в setContentView() – JRowan

+0

@JRowan OMG работает !!! Но можете ли вы объяснить мне, почему drawMaze = новый DrawMaze (это) не работает? –

+0

так, как вы это сделали, делает новый DrawMaze, но когда вы устанавливаете ContentView (макет), который использует DrawView в своем макете, а не тот, который вы создали, плохо поставил как ответ – JRowan

ответ

2

вместо

drawMaze = new DrawMaze(this); 

использование

drawMaze = (DrawMaze)findViewById(R.id.relativeLayout2); 

но под

setContentView() 

причина в том, что когда вы устанавливаете вид контента с вашего макета, он использует DrawMaze от макета, а не в

drawMaze = new DrawMaze(this); 

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

+0

Отличный ответ решил мою проблему :) –

Смежные вопросы