2015-06-05 1 views
0

Мое приложение имеет много элементов в макете (более 100) и объявляет их все в MainActivity, чтобы получить к ним доступ, что делает мой класс MainActivity трудным для чтения и отладки. Так что я создал новый класс для обработки работы с элементами отображения:Использование findViewById во внешнем классе

public class DisplayElementHandler extends Activity{ 
private EditText txtUserID; 
    public void Initialise(){ //initialise all display elements 
     txtUserID = (EditText) findViewById; 
    } 
} 

Однако findViewById не работает, как я ожидал.

Я новичок в Android Studio/Java, и у меня есть я в тупик - может ли кто-нибудь помочь?

+0

Ну, первая Java не является «скриптом». Во-вторых, вы можете [прочитать руководство.] (Http://developer.android.com/reference/android/app/Activity.html#findViewById (int)) и, возможно, [узнать некоторые синтаксисы Java.] (Https : //docs.oracle.com/javase/tutorial/java/javaOO/arguments.html) – markspace

+0

В вашем классе DisplayElementHandler, за исключением экземпляра активности (контекста), во время действия onCreate() или где-то, и используйте это для вызова 'findViewById (...)'. Почему класс DisplayElementHandler наследуется от 'Activity'? –

+0

Ярмарка Достаточно - занял точку - я на самом деле разработчик PHP, поэтому у меня нет всех жалоб для Java. – MadMan

ответ

1

Вы хотите делегировать работу, выполненную вашим Activity классу Handler. Расширение Activity делает Handler своей собственностью (другой экран), и это не совсем то, что вы хотите здесь. Он должен взаимодействовать с вашим существующим Управлением.

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

public class DisplayElementHandler { 
     private Activity activity; 
     public DisplayElementHandler(Activity activity) { 
      this.activity = activity; 
     } 

     public void Initialise(){ //initialise all display elements 
      txtUserID = (EditText) activity.findViewById(...); 
     } 
} 

, а затем в вашем Activity:

public void onCreate(Bundle b) { 
     super.onCreate(b); 
     new DisplayElementHandler(this).Initialise(); 
} 

Вы также можете передать ссылку R.id на представление в обработчик как часть конструктора.

+0

emerssso - означает ли это, что я должен был создать новую «активность», а не новый «Java-класс» « – MadMan

+0

Nah, просто класс java, который вы можете использовать в своей деятельности. Я расширю ответ, чтобы сделать это более ясным. – emerssso

+0

emerssso - Спасибо за вашу помощь (и терпение). Я получил небольшую часть работы, и она выглядит хорошо использовать в тестировании. Использование этой техники сделает мой основной раздел программы намного менее загроможденным и более читаемым, особенно когда мне нужно будет сделать изменения, которые ** будут требоваться после того, как пользователи завладеют им. – MadMan

0

Ну, 100 элементов в одном классе много. Возможно, подумайте об этом и найдите способ уменьшить это: D

Вы пытаетесь вызвать свои элементы из внешнего класса, поэтому вам нужно указать, в каком классе ваши элементы. То, как вы делали поиск только в текущем классе.

+0

Fingu - это много - это началось с 36 макетов - я побрил это до 1 макета, содержащего 5 текстовых пар вопросов/ответов и 5 групп радио, которые я скрываю или показать в зависимости от того, что требования и, конечно, изменить тексты повсюду - 36 макетов было даже больше беспорядок спагетти – MadMan