2012-02-12 6 views
0

эй я нужна помощь, почему я carnt называть changeText() из ClassTwo здесь classOneметоды, требующие от других классов

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

    } 
} 

и здесь classTwo

public class ClassTwo extends ClassOne {  
    public void changeText(){ 
     TextView textOne = (TextView) findViewById(R.id.textview1); 
    textOne.setText("this is how we call methods from other classes"); 
    } 
} 

ошибки находятся в

com.game.ClassTwo.<init>(ClassTwo.java:5) 
com.game.ClassTwo.<init>(ClassOne.java:10) 
+0

findViewById() будет работать только внутри вашего класса активности. –

+0

Это класс активности – barry

ответ

0

Проблема в том, что в то время как ClassTwo extends ClassOne, ваш экземпляр classTwo не инициализирован правильно как действие. Это не часть иерархии представлений, поэтому findViewById ничего не вернет. (Не следует создавать экземпляр подкласса активности, вызывая new и ожидать, что какие-либо из Android методов, чтобы сделать что-нибудь полезное.)

Редизайна кода так ClassTwo не является подкласс активности и редизайн changeText(), чтобы принять Activity пример как аргумент. Например:

package com.game; 
import android.widget.TextView; 
public class ClassTwo { 
    public void changeText(ClassOne activity) { 
     TextView textOne = (TextView) activity.findViewById(R.id.textview1); 
     textOne.setText("this is how we call methods from other classes"); 
    } 
} 
+0

спасибо, но как я могу назвать его в ClassOne? это просто вызов changeText()? – daniel

+0

Как сказал Адил, просто сделайте ClassTwo.changeText (это); – barry

+0

findViewById вернулся как ошибка – daniel

0

ClassTwo является дочерним ClassOne. Он должен быть тем же самым объектом. Пример по умолчанию - это мебель. У вас есть класс Table (classone) и класс KitchenTable, то есть ребенок таблицы.

Теперь легко видеть, что кухонный стол может делать то же самое, что может сделать таблица, но то, что вы пытаетесь сделать, это вызвать кухонный код внутри класса таблицы. Это странно, потому что не все таблицы на самом деле являются кухонными столешницами. Что, если стол будет кемпинг?

SO back to the real world: Если вы хотите эту структуру, вы должны делать все вызовы, специфичные для вещей classTwo в classtwo self. Если вы этого не сделаете, вы можете захотеть чего-то, что не повторяется в этом расширении: помните, если вы делаете new ClassTwo, вы делаете новый activity! Эта деятельность - это точки от classtwo до calssone, у которых есть classtwo и т. Д.

Возможно, вам необходимо переопределить структуру вашего класса. Выясните, что вы хотите, почему вы хотите, и т.д.

+0

ну, у меня есть textView с 5 кнопками, и я хотел иметь второй класс, который запускает весь текст для textView и кнопок, или должен ли я просто иметь код, который запускает весь текст в том же классе, чтобы findViewById работал, которая была бы лучшей практикой – daniel

+0

Если это вспомогательный класс, вам не нужно расширять свой первый класс. – Nanne

+0

ok, так как тогда я использую classtwo в качестве вспомогательного класса – daniel

0

Вот моя проблема с кодом:

  • ClassTwo расширяет ClassOne [это не должно, особенно если вы делаете экземпляр ClassTwo в ClassOne]

Чтобы вызвать метод из ClassOne, вы должны использовать ключевое слово «супер». Например,

class ClassOne{ 
    public void myMethod() { 
     // do stuff 
    } 
} 

class ClassTwo extends ClassOne{ 
    @Override public void myMethod() { 
     super.myMethod(); //call myMethod from ClassOne 
     // add more stuff 
    } 
} 
+0

Я просто хочу знать, как вызывать методы из другого класса, кто-нибудь знает, как это сделать? – daniel

+0

ok плохо редактируйте мое сообщение, чтобы объяснить, что – saada

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