Comments 14
А зачем xmlns делать таким длинным? Почему бы не избавиться от необходимости ставить ns prefix, просто объявив примерно вот так:
/>
? Вроде как стандарт xml это очень даже позволяет.
/>
? Вроде как стандарт xml это очень даже позволяет.
0
Зачем убивать View и опять его создавать?
Все очень просто, создаем ListView и GridView, GridView получает android:visibility=«gone», при нажатии на кнопку меню ListView и GridView меняются visibility.
Работать будет быстрее и ресурсов расходовать будет меньше.
Все очень просто, создаем ListView и GridView, GridView получает android:visibility=«gone», при нажатии на кнопку меню ListView и GridView меняются visibility.
Работать будет быстрее и ресурсов расходовать будет меньше.
0
Ну, если предположить, что такой функцией пользователь легко может не воспользоваться вовсе или всего один-два раза за сеанс, то сомнения как раз вызовет Ваш зря созданный GridView/ListView.
0
Есть в Android API класс ViewSwitcher, который служит как раз для переключения между двумя View, плюс с его помощью просто добавить анимацию при смене.
0
Довольно стремный инструмент. Если я правильно понимаю, то подразумевается анимированное переключение между двумя готовыми, проинициализированными View. Обычно приводится пример с Loading… --> Фейрверк --> Finished! Но тут он хотя бы оправдан, вероятность показа второго View очень высока. А в нашем случае держать постоянно в памяти две копии View «просто на всякий случай» по крайней мере странно. А если View будет больше чем два? Делал как-то табы с одними и теми же данными, сгруппированными и отсортированными по-разному. В итоге отказался от ViewSwitcher и остановился на Fragments. Создаются по пере надобности, переиспользуются, если уже созданны.
0
А по поводу паттернов UI: вы смотрели официальный сборник паттернов от Google?
+1
Сомнительный функционал. Знаете что я скажу. Паттерны существует, но не обязательно их использовать все и везде. Главное, далеко от них не уходить. Кстати кнопки меню уже нету, но допустим что мы засунем эту функцию в overflow у ActionBar. Тут вопрос, стоит ли ее сюда класть, т.к. в overflow следует располагать только самые важные функции. В итоге лично мое мнение, если сильно хотите подобную штуку, засовывать ее надо куда-нибудь подальше в некое окно настроек. Ну мне так кажется.
0
Не знаю кому отвечать, поэтому отвечу всем сразу. Много можно как сделать: и свитчер, и визибилити, и на фрагментах, и просто переходом к новым активити. Поэтому я и написал, что придумать код по этому паттерну не архисложно, а данный пример просто как один из множества вариантов. Как говорится, все пишут по-своему — кому как удобнее.
0
Да не нужно здесь никаких фрагментов, и вьюсвитчеров, все довольноно таки элементарно. Но ваш пример сильно плох, вы и
1. адаптер каждый раз заново создаете,
2. и настройки пишите и читаете зачем то,
3. и вью ищите, хотя это тоже не нужно,
4. затем удаляете и добавляете.
5. да еще и странная работа с меню
ниже сделаю нормальный пример.
1. адаптер каждый раз заново создаете,
2. и настройки пишите и читаете зачем то,
3. и вью ищите, хотя это тоже не нужно,
4. затем удаляете и добавляете.
5. да еще и странная работа с меню
ниже сделаю нормальный пример.
0
1. Согласен — можно было бы один раз создать, а потом использовать, но я здесь не гнался за ресурсоемкостью, а так мне было удобнее в одну строчку написать; как и лист и грид можно было бы один раз всего найти (в этом я не прав — признаю).
2. вы тоже пользуете настройки, так что не сильно что-либо меняете (каждый делает настройки как ему удобнее).
5. не вижу ничего странного в работе с меню. Единственно, что я создал объект инфлейтера, то есть противоречил утверждению, которое сказал в начале, но вы явно не это имели в виду.
А на ваш вариант написания ещё во втором комментарии предлагали. И какой вариант лучше можно очень долго спорить.
2. вы тоже пользуете настройки, так что не сильно что-либо меняете (каждый делает настройки как ему удобнее).
5. не вижу ничего странного в работе с меню. Единственно, что я создал объект инфлейтера, то есть противоречил утверждению, которое сказал в начале, но вы явно не это имели в виду.
А на ваш вариант написания ещё во втором комментарии предлагали. И какой вариант лучше можно очень долго спорить.
0
> 1. Согласен — можно было бы один раз создать, а потом использовать, но я здесь не гнался за ресурсоемкостью, а так мне было удобнее в одну строчку написать;
В одну строчку? :) То есть вместо 4х строчек вы предпочли сделать это все в 14, да и еще умудрились создать не нужные проблемы.
2. Проблема не в настройках, это нормально запоминать состояние, при закрытии программы. Проблема в том что вы на каждое нажатие кнопки это делаете два раза.
5. Вместо того что бы определить что пользователь нажал, вы опираетесь на то что у вас записано в настройках, соответственно снова п2.
Спорить, шутите? Тут же решение по сути только одно, причем элементарное. Но вам удалось в нем сделать много ошибок. Извините, но такое нельзя советовать к прочтению для новичков.
В одну строчку? :) То есть вместо 4х строчек вы предпочли сделать это все в 14, да и еще умудрились создать не нужные проблемы.
2. Проблема не в настройках, это нормально запоминать состояние, при закрытии программы. Проблема в том что вы на каждое нажатие кнопки это делаете два раза.
5. Вместо того что бы определить что пользователь нажал, вы опираетесь на то что у вас записано в настройках, соответственно снова п2.
Спорить, шутите? Тут же решение по сути только одно, причем элементарное. Но вам удалось в нем сделать много ошибок. Извините, но такое нельзя советовать к прочтению для новичков.
0
Не, ну так не пойдет, сильно много недочетов, проще самому нормальный пример привести, тем более что если статья позиционируется как инструкция для новичков. Итак начнем:
1. нам нужна разметка, res/layout/main.xml:
2. нужно меню, res/menu/menu.xml:
3. Собственно сам код:
1. нам нужна разметка, res/layout/main.xml:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/listLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<GridView
android:id="@+id/gridLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="4"
android:gravity="center"
android:visibility="gone" />
</FrameLayout>
2. нужно меню, res/menu/menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item" android:title="Show GridView" android:checkable="true" />
</menu>
3. Собственно сам код:
public class TestActivity extends Activity {
private final static String[] CONTENT = new String[]{
"Item 1", "Item 2", "Item 3", "Item 4", "Item 5",
"Item 6", "Item 7", "Item 8", "Item 9", "Item 10"};
private SharedPreferences mSettings;
private GridView mGridView;
private ListView mListView;
private boolean mIsListVisible;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSettings = getPreferences(MODE_PRIVATE);
mGridView = (GridView) findViewById(R.id.gridLayout);
mGridView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, CONTENT));
mListView = (ListView) findViewById(R.id.listLayout);
mListView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, CONTENT));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
menu.findItem(R.id.item).setChecked(mIsListVisible);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.item) {
boolean isChecked = !item.isChecked();
item.setChecked(isChecked);
item.setTitle(isChecked ? "Show GridView" : "Show ListView");
showListView(isChecked);
return true;
}
return false;
}
private void showListView(boolean show) {
mIsListVisible = show;
mListView.setVisibility(show ? View.VISIBLE : View.GONE);
mGridView.setVisibility(show ? View.GONE : View.VISIBLE);
}
@Override
protected void onResume() {
super.onResume();
showListView(mSettings.getBoolean("show_list", true));
}
@Override
protected void onPause() {
super.onPause();
mSettings.edit().putBoolean("show_list", mIsListVisible).commit();
}
}
0
Sign up to leave a comment.
Change view. Изменяем вид интерфейса