Можно ли инициализировать все элементы пользовательского интерфейса одним способом?

Возможно ли инициализировать все элементы пользовательского интерфейса определенного типа (например, все TextViews или все LineraLayouts или...) в каком-то виде?

У меня много макетов с множеством элементов того же типа, и мне очень больно делать все, просто набрав.

3 ответа

Вы можете использовать RoboGuice. Он не использует циклы, но помогает вам вставлять ваш View, Resource, System Service или любой другой объект в ваш код.

RoboGuice - это основа, которая обеспечивает простоту и удобство Injection Dependency для Android, используя собственную Guice-библиотеку Google.

Чтобы дать вам представление, взгляните на этот простой пример типичной активности Android:

class AndroidWay extends Activity { 
TextView name; 
ImageView thumbnail; 
LocationManager loc; 
Drawable icon; 
String myName; 

public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main);
 name = (TextView) findViewById(R.id.name); 
 thumbnail = (ImageView) findViewById(R.id.thumbnail); 
 loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); 
 icon = getResources().getDrawable(R.drawable.icon); 
 myName = getString(R.string.app_name); 
 name.setText( "Hello, " + myName ); 
} 
}

Этот пример - 19 строк кода. Если вы пытаетесь прочитать onCreate(), вам нужно пропустить более 5 строк инициализации шаблона, чтобы найти единственное, что действительно имеет значение: name.setText(). И сложные действия могут в конечном итоге получить гораздо больше такого типа кода инициализации.

Сравните это с тем же приложением, написанным с помощью RoboGuice:

class RoboWay extends RoboActivity { 
@InjectView(R.id.name) TextView name; 
@InjectView(R.id.thumbnail) ImageView thumbnail; 
@InjectResource(R.drawable.icon) Drawable icon; 
@InjectResource(R.string.app_name) String myName; 
@Inject LocationManager loc; 

public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main);
 name.setText( "Hello, " + myName ); 
} 
}

В этом примере onCreate() гораздо проще взять с первого взгляда. Весь шаблон платформы убирается, и вы остаетесь с помощью своей собственной бизнес-логики приложения. Вам нужен SystemService? Вставить один. Вам нужен вид или ресурс? Внесите их и RoboGuice позаботится о деталях.

Цель RoboGuice состоит в том, чтобы сделать ваш код о вашем приложении, а не о кодах инициализации и жизненного цикла, которые, как правило, вам необходимо поддерживать в Android.

Этот текст отсюда


Я/сделал что-то подобное. Просто для вашей справки, вот код:

public class AbcActivity extends Activity 
{
 protected boolean changesPending;


 /** Called when the activity is first created. */

 @Override
 public void onCreate(Bundle savedInstanceState) 
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.login_screen);
 setViews(); //this method is created and called to take care of the buttons and edittext fields, and can probably hold a number of other fields/widgets as well
 }

 /** Take care of the Buttons and EditTexts here*/
 private void setViews() 
 {
 EditText userEdit = (EditText)findViewById(R.id.editText1);
 EditText passwordEdit = (EditText)findViewById(R.id.editText2);
 Button loginButton = (Button)findViewById(R.id.login_button);
 loginButton.setOnClickListener(new View.OnClickListener() 
 {
 public void onClick(View v) 
 {
 login(); // some random method
 }
 });

 Button cancelButton = (Button)findViewById(R.id.cancel_button);
 cancelButton.setOnClickListener(new View.OnClickListener() 
 {
 public void onClick(View v) 
 {
 cancel(); //another random method
 }
 });

 userEdit.addTextChangedListener(new TextWatcher() 
 {
 public void onTextChanged(CharSequence s, int start, int before, int count) 
 {
 changesPending = true;
 }

 public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 public void afterTextChanged(Editable s) {}
 });

 passwordEdit.addTextChangedListener(new TextWatcher() 
 {
 public void onTextChanged(CharSequence s, int start, int before, int count) 
 {
 changesPending = true;
 }

 public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 public void afterTextChanged(Editable s) {}
 });
 }
}

Надеюсь это поможет.


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

ViewGroup container = (ViewGroup) findViewById(R.id.container);
 for(int i = 0; i < NUM_TEXT_VIEWS; i++){
 TextView tv = new TextView(this); // where 'this' is your Activity
 tv.setText("This is TextView " + i);
 container.addView(tv);
 }

Набор свойств в файле XML для View обычно имеют соответствующий вызов метода Java.

licensed under cc by-sa 3.0 with attribution.