Android: фрагменты

Рейтинг: -1Ответов: 1Опубликовано: 25.04.2015

Необходимо в фрагменте реализовать метод OnClick, который бы по нажатию на изображение создавал другое изображение в специально отведенной для этого разметке. Делаю это следующим макаром.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mKoloda = new Koloda();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_koloda, parent, false);
    // берем изображение, по нажатие на которое должно появляться др. изображение
    Gera = (ImageView) v.findViewById(R.id.imageView4);
    Gera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                // создаю изображение
                ImageView gera = new ImageView(KolodaFragment.this/*где его создавать??!! KolodaFragment имя фрагмента*/);
                gera.setImageResource(R.drawable.gera1);
                // добавляем виджет в контейнер. Этот контейнер находится в основной активности, которая использует фрагмент.
                LinearLayout layout = (LinearLayout) v.findViewById(R.id.SpisokKart);
                layout.addView(knopka);

        }
    });

    return v;
}

Но в отмеченном месте я не знаю, что писать. Eclipse ругается :(

И сразу же следующий вопрос. Как получить данные из той разметки, где лежат картинки (т.е. какие там лежат картинки) в другой активности? Молю о помощи...

Ответы

▲ 2

При динамическом создании виджетов , таких , как ImageView , Button и тд. им требуется контекст активити , в которой они создаются .

В случае , когда используется фрагмент , получить этот контекст можно методом класса Fragment getActivity() , что в фрагменте эквивалентно служебному слову this самой активити:

ImageView gera = new ImageView(getActivity());

Однако , при конечном и заранее известном количестве виджетов на разметке , которые до некоторого времени должны быть скрыты , возможно эффективнее будет создать готовую разметку с этими виджетами и указать им атрибут :

android:visibility = "gone" - для того , чтобы элемент вообще не участвовал в создании разметки и не занимал место.

android:visibility = "invisible" - для того , чтобы элемент был невидим , но занимал положенное ему место в структуре разметки.

Далее в коде вы уже не создаете виджеты динамически и не "шлете" их в layout , а получаете их обычным методом findViewById() и работаете с видимостью уже существующих виджетов:

imageView.setVisibility(View.VISIBLE);  //показать виджет
imageView.setVisibility(View.INVISIBLE); //скрыть виджет, но оставить занимаемое место
imageView.setVisibility(View.GONE); //убрать виджет с разметки

Так же стоит заметить , что при некотором количестве скрытых элементов , рекомендуется использовать виджет-контейнер ViewStub , который не занимает ресурсы и никак не участвует в разметке и ее расчетах , пока невидим , что благоприятно сказывается на скорости просчета интерфейса , так как в противном случае , даже если элемент и невидим , все расчеты по его "созданию" все равно проводятся , что напрасно отнимает ресурсы устройства.

Что касается доступа к layout одной активити из другой активити , то это невозможно , так как активити ( и их разметки ) , в данный момент не отображаемые на экране, фактически не существуют , то есть она может и быть еще в памяти , но сколько там пробудет прежде , чем будет уничтожена никто не даст ответа ,потому считается , что ее просто нет .

Если вам нужна некая конфигурация , какие были элементы на разметке из этой активити , то ее нужно сохранять и передавать в другую активити отдельно , организовав какой-нибудь массив (коллекцию) , содержащий , скажем , имена (или id изображений, если с ними требуется работать в другом месте ) тех картинок , что были показаны в случае краткосрочного хранения ( в период одного запуска приложения ) , либо запись тех же данных в БД , файл или другие хранилища для долгосрочного хранения , если данная информация должна сохраняться и после закрытия приложения. Далее уже работать с этими данными для востановления "как было" или что-нибудь еще , что вам надо .