Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
MasterEx
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 4
#1

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

20.12.2015, 18:14. Просмотров 556. Ответов 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 - Программирование Android
Всем привет! У меня в роли setContentView выступает класс Draw2D, в котором я собираюсь рисовать кое-какую графику. Графика рисуется...

Программное добавление View - Программирование Android
Не могу разобраться: нужно программно прилепить н-ное количество вьюх. Делаю так: Dialog dialog = new Dialog(pd.getContext()); ...

Программное добавление View - Программирование Android
Доброго времени. Знаю что на эту тему много инфы, как на форуме так и на других ресурсах, но решения своей проблемы все же не нашел. суть...

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

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

Fragment как в нем добавить List View - Программирование Android
В моей программе я с главного активити через naviganion drawer попадаю во фрагмент и в этом фрагменте мне нужно чтобы у меня был list view....

7
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,948
Завершенные тесты: 1
21.12.2015, 13:24 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вместо
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
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,948
Завершенные тесты: 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
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,948
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2015, 17:35
Привет! Вот еще темы с ответами:

ClassNotFoundException. android.view.fragment. как лечить? - Программирование Android
Добрый день всем. Есть очень банальная проблема. ClassNotFoundException лейаут popup.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; ...

Обновление fragment из другого fragment - Программирование Android
Добрый вечер всем!! Подскажите пожалуйста как обновить один фрагмент из другого (а именно TextView и ArrayAdapter)?

Добавление View (кнопки) в PreferenceScreen - Программирование Android
Здравствуйте! не получается добавить View (кнопку) в общую структуру PreferenceScreen, через this.addContentView добавляется, но...

Добавление элемента - наследника View - Программирование Android
Здравствуйте. Пишу для Android простенькую игрушку. Для нее мне понадобилось написать класс, рисующий круг - наследник View. На экране...


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

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

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