2015-10-04 2 views
1

Я новичок в android, и я пытаюсь вызвать метод, который перемещает круг, нарисованный пользовательским представлением, используя холст на 10 пикселей. Когда я пытаюсь вызвать упомянутый метод, я получаю исключение с нулевым указателем, и я не могу понять, почему. Вот что у меня есть.Android - Получение исключения из null-указателя при вызове пользовательского метода просмотра

Основная деятельность

public class CustomView extends Activity { 
XView xv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_customview); 
} 

public void moveUp(View view){ 
    xv.setY(view); 
} 

} 

Обычай Просмотр

public class XView extends View implements View.OnClickListener{ 

private Paint mPaint = new Paint(); 
int oX = 200; 
int oY = 200; 


public XView(Context context, AttributeSet attrs){ 
    super(context, attrs); 
    //setOnClickListener(this); 
} 



@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    mPaint.setStyle(Paint.Style.FILL); 
    mPaint.setColor(Color.MAGENTA); 

    canvas.drawColor(Color.WHITE); 
    canvas.drawCircle(oX, oY, 50, mPaint); 
} 
public void onClick(View view){ 
    oX=oX+10; 
    view.postInvalidate(); 
} 


public void setY(View view) 
{ 
    oY=oY+10; 
    view.postInvalidate(); 
} 
} 

в XML для основной деятельности

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".customview" 
android:orientation="vertical"> 

<com.mycompany.customview.XView 
    android:layout_width="wrap_content" 
    android:layout_height="200dp" /> 


<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_alignParentTop="true" 
     android:layout_alignLeft="@+id/button2" 
     android:layout_alignStart="@+id/button2" 
     android:onClick="moveUp"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_alignTop="@+id/button2" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/button" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/button2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_centerVertical="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:id="@+id/button" /> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:id="@+id/button5" 
     android:layout_alignParentBottom="true" 
     android:layout_alignLeft="@+id/button2" 
     android:layout_alignStart="@+id/button2" /> 
</RelativeLayout> 

Благодаря

ответ

3

вам нужно добавить идентификатор к пользовательскому зрения в вашем XML:

<com.mycompany.customview.XView 
    android:id="@+id/xvview_id" 
    android:layout_width="wrap_content" 
    android:layout_height="200dp" /> 

и использовать findViewById инициализировать ваш член

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_customview); 
    xv = (XView) findViewById(R.id.xvview_id); 
} 

При вызове setContentView, Android «добавляет», виджеты которые вы указали в своем макете как часть иерархии представлений Activity, сделав их доступными для вас в контексте текущей активности. Что вам нужно сделать, так это просто позвонить findViewById, чтобы получить ссылку на виджет, с которым вы хотите работать с

+0

Спасибо, что сделал трюк. – user798774

+0

Что делать, если пользовательский вид добавляется через код и его нет в XML-макете? –

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