Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
MasterEx
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 4
#1

Программное добавление View элементов в Fragment - Программирование Android

20.12.2015, 18:14. Просмотров 762. Ответов 7
Метки нет (Все метки)

Здравствуйте. Проблема такая: в приложении есть 2 вкладки. Переключение между ними реализуются через ViewPager и FragmentStatePagerAdapter. В 1 вкладке View элементы заданы статически через xml. Но при программном добавлении ImageView во второй fragment картинка отображается в основной активити поверх всех вкладок. В чем причина?
Код таб адаптера:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TabAdapter extends FragmentStatePagerAdapter {
    private int numberOfTabs;
    public TabAdapter(FragmentManager fm, int numberOfTabs) {
        super(fm);
        this.numberOfTabs=numberOfTabs;
    }
 
 
 
    @Override
    public Fragment getItem(int i) {
        switch (i){
            case 0:
                return new tab1();
            case 1:
                return new tab2();
            default:
                return null;
        }
 
    }
 
    @Override
    public int getCount() {
        return numberOfTabs;
    }
}
Код второго фрагмента:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class News extends Fragment {
 
 
 
    public tab2() {
        // Required empty public constructor
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_news, container, false);
        final ImageView kart1 = new ImageView(inflater.getContext());
        float density = getActivity().getApplicationContext().getResources().getDisplayMetrics().density;
        Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    final Bitmap bitmap = BitmapFactory.decodeStream(new URL("//адрес изображения").openStream());
                    kart1.post(new Runnable() {
                        @Override
                        public void run() {
                            kart1.setImageBitmap(bitmap);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
            ;
        };
        t.start();
 
        ViewGroup.LayoutParams pal = new RelativeLayout.LayoutParams(200, 200);
        if(kart1.getParent()!=null)
            ((ViewGroup) kart1.getParent()).removeView(kart1);
        kart1.setLayoutParams(pal);
        kart1.setX(500);
        kart1.setY(500);
        getActivity().addContentView(kart1, pal);
        return v;
    }
 
 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2015, 18:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программное добавление View элементов в Fragment (Программирование Android):

Программное добавление View
Не могу разобраться: нужно программно прилепить н-ное количество вьюх. Делаю...

Программное добавление View
Всем привет! У меня в роли setContentView выступает класс Draw2D, в котором я...

Программное добавление View
Доброго времени. Знаю что на эту тему много инфы, как на форуме так и на других...

Отличие Fragment от View
В чем принципиальное отличие фрагментов от View?? Почему нельзя стоить...

Программное добавление элементов
Уважаемы подскажите такую ситуацию, не могу немного понять...Как на Relative...

ClassNotFoundException. android.view.fragment. как лечить?
Добрый день всем. Есть очень банальная проблема. ClassNotFoundException ...

7
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
21.12.2015, 13:24 #2
Лучший ответ Сообщение было отмечено MasterEx как решение

Решение

вместо
Java
1
getActivity().addContentView(kart1, pal);
надо написать что-то типа
Java
1
2
        ViewGroup vg = (ViewGroup) v;
        v.addView(kart1, pal);
и строчка kart1.setLayoutParams(pal); лишняя
1
MasterEx
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 4
21.12.2015, 16:53  [ТС] #3
Большое спасибо!

Добавлено через 52 минуты
Не подскажите заодно, как узнать плотность экрана во фрагменте?
Java
1
 float density=vg.getResources().getDisplayMetrics().density;;
Не работает
Как и
Java
1
 float density=getActivity().getApplicationContext().getResources().getDisplayMetrics().density;;
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
21.12.2015, 16:57 #4
Java
1
DisplayMetrics metrics = getResources().getDisplayMetrics();
но зачем это делать во фрагменте? и зачем вообще надо плотность экрана?
обычно все верстается в dp, а не в икселях
0
MasterEx
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 4
21.12.2015, 17:00  [ТС] #5
Уже разобрался. Все работает, выставил слишком большие координаты изображения. Ну так все и идет в DP. Т.е. координаты изображения:
Java
1
2
 kart1.setX(x*density);
 kart1.setY(y*density);
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
21.12.2015, 17:11 #6
не знаю, пойдет ли, но есть такая фишка - указывать размеры не в коде программы а в ресурсах
то есть, сейчас в коде программы где-то жестко зашит размер вьюшки
я предлагаю вынести этот magic number в ресурсы
1. создаем или отдельным файл в папке res или открываем dimens.xml
2. дописываем туда что-то типа
XML
1
<dimen name="my_awesome_view_size">666dp</dimen>
то есть все-таки указываем какого размера в DP должна быть наша вьюшка
3. в коде, там где она программно создается вместо педалирования плотностями, просто пишем
Java
1
float size = getResources().getDimension(R.dimen.my_awesome_view_size);
нам вернет число - размер вьюшки в пикселях
4. PROFIT у нас в коде не мелькает размер вьюшки и не нужно должно вспоминать или искать где он меняется - размеры там, где им и полагается быть - res/dimens.xml
1
MasterEx
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 4
21.12.2015, 17:29  [ТС] #7
Так наверное лучше, но на одной из активити у меня программно создаётся и динамически добавляется большое количество ImageView. И, подгоняя их размер, пока проще изменять в коде значения переменных типа
Java
1
int highOfImage1 = 35 * (int) density;
Добавлено через 9 минут
У меня к вам еще 1 вопрос . Как реализовать скроллинг на одной из вкладок? Разметка второй вкладки:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="qwe.myapplication.ScrollingActivity">
 
 
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="mchstudio.myapplication.ScrollingActivity">
 
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
 
    </android.support.v4.widget.NestedScrollView>
 
 
</FrameLayout>
Разметка основной активити:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
<FrameLayout
    android:layout_width="match_parent"
    android:id="@+id/content_frame"
    android:layout_height="wrap_content">
 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="112dp"/>
 
    <android.support.design.widget.AppBarLayout
        android:id="@+id/include"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">
 
 
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>
 
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:tabIndicatorColor="@android:color/background_light"
            app:tabSelectedTextColor="@android:color/background_light"
            app:tabTextColor="@android:color/background_light"
            />
 
 
    </android.support.design.widget.AppBarLayout>
 
 
 
 
</FrameLayout>
    </android.support.design.widget.CoordinatorLayout>
0
Pablito
21.12.2015, 17:35     Программное добавление View элементов в Fragment
  #8

Не по теме:

одна тема - один вопрос, это правило форума

и я точно не буду разбираться в этой разметке
1. она или скопирована неправильно или так и есть
2. appbar с тулбаром не там где надо в иерархии
3. лишний framelayout
4. непонятно как связан вопрос проскролинг на вкладке и разметки двух активити

0
21.12.2015, 17:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2015, 17:35
Привет! Вот еще темы с ответами:

Fragment как в нем добавить List View
В моей программе я с главного активити через naviganion drawer попадаю во...

Несколько ViewHolder или программное добавление элементов в один
Добрый день. Как правильнее реализовать список RecyclerView с переменными...

Обновление fragment из другого fragment
Добрый вечер всем!! Подскажите пожалуйста как обновить один фрагмент из другого...

Программное добавление строкового ресурса
Здравствуйте! Я храню данные для ListView в XML-файле строковых ресурсов:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru