2016-03-05 8 views
1

Я учусь Android от нескольких учебных пособий, а когда речь заходит об использовании OnClickListeners, я заметил, что многие из них используют анонимные внутренние классы, как так:Анонимные внутренние классы и хорошая практика

public class MainActivity extends AppCompatActivity { 

    private EditText mNameField; 
    private Button mStartButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mNameField = (EditText) findViewById(R.id.nameEditText); 
     mStartButton = (Button) findViewById(R.id.startButton); 

     mStartButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String name = mNameField.getText().toString(); 
       Toast.makeText(MainActivity.this, name, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

} 

Это считается хорошая практика иметь класс внутри класса? Или считается, что лучше каким-то образом определить этот класс вне где-нибудь, а затем ссылаться на него? Как мне это сделать?

+0

Возможный дубликат [Как Анонимные (внутренние) классы используются в Java? ] (http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java) –

+0

@AndrewRegan Я знаю, как они используются, но я спрашиваю, считаются ли они od практика. – DoubleBass

+0

Документация на Android не слишком наводит на размышления о том, какой подход является «лучшим», но если у вас есть несколько кнопок в макете, вы не будете создавать анонимные классы для каждой кнопки. Это становится громоздким. Вместо этого рассмотрите возможность внедрения OnClickListener как части вашего Activity/Fragment. – Susheel

ответ

1

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

public class MainActivity extends Activity { 
View.OnClickListener onClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //some code 
    } 
}; 

mStartButton.setOnClickListener(onClickListener); 

При использовании же слушателя в нескольких классах

public class WidelyUsedOnClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
    //some code 
    } 

} Затем в деятельности

WidelyUsedOnClickLister onClickListener = new WidelyUsedOnClickLister(); 
mStartButton.setOnClickListener(onClickListener); 
0

Inner Class Концепция пришел только когда без существующей одной Objcet (класса) не существует никакой возможности существовать другой Object (Class). то вы можете создать class внутри Class.

Эта концепция взята с Java v1.1, когда AWT представлена ​​на языке Java для выполнения eventhandling. Как вы использовали в своем коде

mStartButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    } 
}); 

здесь Click случае, если и только там Clickable Object существует (например: - Button или anyOther). Таким образом, EventListener должен быть связан только с теми components, которые ему действительно нужны. это имеет смысл ...

========== Альтернативы =============

Вы также можете реализовать OnClickListener() в любой другой Пользовательский Event Handler Класс. но это будет очень беспокойная задача сделать так, потому что если вы использовали 6 (предположит, что) Кликабельные Componenets, то вы должны написатьsix другого Class EventHandler и передать Class на

    new View.OnClickListener(new CustomEventHandler()) 

Надеется, что вы получили концепцию .. Есть так много больше последствий, но вы должны подумать об этом один раз. Вы можете получить свой ответ.

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