2013-04-11 2 views
-1

Я новичок в программировании и Android. Я построил небольшое приложение для подсчета денег. Это всего лишь один большой файл на данный момент с использованием многих методов. Так что я подумал, что я бы немного его организовал и пошел и поместил вещи в классы. У меня есть этот метод CLEARALL, который я наношу в классе CLEARALL:Как правильно использовать классы в Android

import android.widget.EditText; 
import android.widget.TextView; 

public class ClearAll extends MainActivity { 

    public void clearAll() { 
     // Set EditTexts to "" 
     ((EditText) findViewById(R.id.euro500)).setText(""); 
     ((EditText) findViewById(R.id.euro200)).setText(""); 
     ((EditText) findViewById(R.id.euro100)).setText(""); 
     ((EditText) findViewById(R.id.euro50)).setText(""); 
     ((EditText) findViewById(R.id.euro20)).setText(""); 
     ((EditText) findViewById(R.id.euro10)).setText(""); 
     ((EditText) findViewById(R.id.euro5)).setText(""); 
     ((EditText) findViewById(R.id.euro2)).setText(""); 
     ((EditText) findViewById(R.id.euro1)).setText(""); 
     ((EditText) findViewById(R.id.cent50)).setText(""); 
     ((EditText) findViewById(R.id.cent20)).setText(""); 
     ((EditText) findViewById(R.id.cent10)).setText(""); 
     ((EditText) findViewById(R.id.cent5)).setText(""); 
     ((EditText) findViewById(R.id.cent2)).setText(""); 
     ((EditText) findViewById(R.id.cent1)).setText(""); 

     // Set TextViews to "0.00" 
     ((TextView) findViewById(R.id.tvEuro500Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro200Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro100Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro50Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro20Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro10Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro5Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro2Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvEuro1Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent50Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent20Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent10Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent5Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent2Totaal)).setText(R.string.puntjes); 
     ((TextView) findViewById(R.id.tvCent1Totaal)).setText(R.string.puntjes); 

     ((TextView) findViewById(R.id.tvTotaalBedrag)).setText(R.string.puntjes); 
    } 
} 

Так что в моем MainActivity я делаю:

ClearAll clear = new ClearAll(); 
clear.clearAll(); 

Но когда это называется приложение падает с NullPointerException на findViewById. Я искал какое-то время, и это оставило мне больше вопросов, чем когда я начал. Кажется, что вы не можете использовать findViewById ouside для основного действия, потому что вы не установили setContentView(). Который я не буду делать, так как это не основной вид деятельности. Я также попытался поставить простой тост в отдельный класс и назвал это, но это тоже сработало. Так что я просто не делаю это правильно.

Может кто-нибудь пожелает дать мне несколько указаний о том, как правильно использовать классы в Android?

Приветствия,

Даан

ответ

0

Это не о андроиде, это чисто о Java. Вы должны понять, как работают экземпляры.

В вашем экземпляре ClearAll ничего нет.

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

Текущая деятельность (я предполагаю) экземпляр MainActivity, из которого вы вызываете ClearAll.

Есть несколько вариантов:

  1. положить обратно CLEARALL в MainActivity
  2. сделать CLEARALL абстрактный класс, который расширяет активность. Сделать MainActivity расширением ClearAll. Теперь из MainActivity вы можете позвонить this.clearAll()
  3. сделать ClearAll абстрактным классом, который ничего не расширяет. make clearВсе статический метод, который принимает Activity как параметр. используйте этот параметр для вызова findViewById. Из MainActivity теперь вы можете позвонить ClearAll.clearAll (this)

Я рекомендую вариант 1. Варианты 2 и 3 предпочтительнее, если вы будете использовать этот метод в нескольких классах.

Кроме того, что касается уменьшения количества кода и, что более важно, дублированных строк, я предлагаю создать коллекцию (массив, список ...) идентификаторов для EditText и еще один для TextView и цикл для этой коллекции, чтобы очистить содержимое.

Нечто подобное (в MainActivity):

private final static int[] EDIT_IDS = new int[] {R.id.euro500, ... } 
private final static int[] TEXT_IDS = new int[] {R.id.tvEuro500Totaal, ... } 

private void clearAll() { 
    for (int id : EDIT_IDS) { 
     ((EditText) findViewById(id)).setText(""); 
    } 
    for (int id : TEXT_IDS) { 
     ((TextView) findViewById(id)).setText(R.string.puntjes); 
    } 
} 
+0

Спасибо, человек, я вернусь к тому, как мой код был и начал экспериментировать с другими методами, помещая их в классы. Я уже думал о создании цикла для метода clearAll. Большое спасибо за пример! – stofstik

0

Вы должны иметь setContentView (R.layout.activity_main) в OnCreate(), а затем получить идентификатор по findViewById(), а затем установить текст в NULL.

Поскольку вы не задали свой макет, вы не можете получить идентификаторы findViewById(). Следовательно, вы получаете исключение nullpointer.

public class MainActivity extends Activity { 


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

    setContentView(R.layout.activity_main); 
      clearAll(); 
      } 
     public void clearAll() { 
     // Set EditTexts to "" 
     ((EditText) findViewById(R.id.euro500)).setText(""); 
     ((EditText) findViewById(R.id.euro200)).setText(""); 

      } 

    } 
+0

Да, я знаю, что было, как у меня было, и это работало нормально. Сейчас я пытаюсь включить его в класс ClearAll. – stofstik

+0

Pragnani предоставил вам решение – Raghunandan

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