Можно ли инициализировать все элементы интерфейса одним методом? - PullRequest
0 голосов
/ 24 января 2012

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

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

Ответы [ 3 ]

2 голосов
/ 24 января 2012

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

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

Чтобы дать вам представление, взгляните на этот простой примерТипичная активность 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.

Этот текст здесь

1 голос
/ 24 января 2012

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

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) {}
        });
    }
}

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

0 голосов
/ 24 января 2012

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

    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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...