Как стать автором
Обновить

Комментарии 14

А зачем xmlns делать таким длинным? Почему бы не избавиться от необходимости ставить ns prefix, просто объявив примерно вот так:

/>


? Вроде как стандарт xml это очень даже позволяет.
Зачем убивать View и опять его создавать?
Все очень просто, создаем ListView и GridView, GridView получает android:visibility=«gone», при нажатии на кнопку меню ListView и GridView меняются visibility.
Работать будет быстрее и ресурсов расходовать будет меньше.
Ну, если предположить, что такой функцией пользователь легко может не воспользоваться вовсе или всего один-два раза за сеанс, то сомнения как раз вызовет Ваш зря созданный GridView/ListView.
Есть в Android API класс ViewSwitcher, который служит как раз для переключения между двумя View, плюс с его помощью просто добавить анимацию при смене.
Довольно стремный инструмент. Если я правильно понимаю, то подразумевается анимированное переключение между двумя готовыми, проинициализированными View. Обычно приводится пример с Loading… --> Фейрверк --> Finished! Но тут он хотя бы оправдан, вероятность показа второго View очень высока. А в нашем случае держать постоянно в памяти две копии View «просто на всякий случай» по крайней мере странно. А если View будет больше чем два? Делал как-то табы с одними и теми же данными, сгруппированными и отсортированными по-разному. В итоге отказался от ViewSwitcher и остановился на Fragments. Создаются по пере надобности, переиспользуются, если уже созданны.
Под каждую задачу свой инструмент, я просто дал ссылку для тех, кто о ViewSwitcher не знает. Хуже от этого знания не будет.
Хорошо. Тогда давайте дополним и сразу же и закроем тему.
ViewFlipper
ViewPager
Сомнительный функционал. Знаете что я скажу. Паттерны существует, но не обязательно их использовать все и везде. Главное, далеко от них не уходить. Кстати кнопки меню уже нету, но допустим что мы засунем эту функцию в overflow у ActionBar. Тут вопрос, стоит ли ее сюда класть, т.к. в overflow следует располагать только самые важные функции. В итоге лично мое мнение, если сильно хотите подобную штуку, засовывать ее надо куда-нибудь подальше в некое окно настроек. Ну мне так кажется.
Не знаю кому отвечать, поэтому отвечу всем сразу. Много можно как сделать: и свитчер, и визибилити, и на фрагментах, и просто переходом к новым активити. Поэтому я и написал, что придумать код по этому паттерну не архисложно, а данный пример просто как один из множества вариантов. Как говорится, все пишут по-своему — кому как удобнее.
Да не нужно здесь никаких фрагментов, и вьюсвитчеров, все довольноно таки элементарно. Но ваш пример сильно плох, вы и
1. адаптер каждый раз заново создаете,
2. и настройки пишите и читаете зачем то,
3. и вью ищите, хотя это тоже не нужно,
4. затем удаляете и добавляете.
5. да еще и странная работа с меню

ниже сделаю нормальный пример.
1. Согласен — можно было бы один раз создать, а потом использовать, но я здесь не гнался за ресурсоемкостью, а так мне было удобнее в одну строчку написать; как и лист и грид можно было бы один раз всего найти (в этом я не прав — признаю).

2. вы тоже пользуете настройки, так что не сильно что-либо меняете (каждый делает настройки как ему удобнее).

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

А на ваш вариант написания ещё во втором комментарии предлагали. И какой вариант лучше можно очень долго спорить.
> 1. Согласен — можно было бы один раз создать, а потом использовать, но я здесь не гнался за ресурсоемкостью, а так мне было удобнее в одну строчку написать;

В одну строчку? :) То есть вместо 4х строчек вы предпочли сделать это все в 14, да и еще умудрились создать не нужные проблемы.

2. Проблема не в настройках, это нормально запоминать состояние, при закрытии программы. Проблема в том что вы на каждое нажатие кнопки это делаете два раза.

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

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

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();
    }
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории