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

Задать программно свойства Fragment

18.11.2014, 18:55. Просмотров 950. Ответов 3
Метки нет (Все метки)

Доброго времени суток, я новичок в этом деле, поетому хочу попросить у вас помощи, мне нужно передать фрагменту программно свойства, у меня есть контейнер в который должно программно динамически добавляться карта
вот код в хмл
XML
1
2
3
4
5
6
7
8
 <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:layout_column="0"
            android:layout_row="3">
        </fragment>
мне нужно передать это программно при создании Fragment
XML
1
            android:name="com.google.android.gms.maps.MapFragment"
вот как я пытаюсь это сделать
Java
1
2
3
4
5
6
     Context context = getActivity().getApplicationContext();
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout = (LinearLayout) view.findViewById(R.id.conteiner_map);
        FrameLayout frameLayout = new FrameLayout(context);
        frameLayout.setId(R.id.id_map_fragment);
        linearLayout.addView(frameLayout);
буду благодарен за любую помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 18:55
Ответы с готовыми решениями:

Программно создать таблицу в Fragment
Добрый день форумчане, возник у меня такой вопрос. Пытаюсь программно создать...

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

Изменить свойства программно созданного элемента
Проблема. Есть карта на ней маркеры список имен маркеров можно получить...

Задать ScrollView программно
Здраствуйте! Как сделать ScrollView с элементом LinearLayout программно? Делаю...

TextView задать отступ программно
Программно создаю TextView . Присваиваю ему ряд значений ...

3
Grigoriy9
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 11
19.11.2014, 01:47 #2
Привет
Java
1
2
3
FrameLayout frameLayout = new FrameLayout(context);
        frameLayout.setId(R.id.id_map_fragment);
        linearLayout.addView(frameLayout);
никакие свойства вы таким образом не передадите. Здесь просто создается FrameLayout и присваивется id такой же как в xml файле. Чтобы взять именно тот layout нужно сделать примерно так: frameLayout = ( FrameLayout) getActivity ().findViewById (<id фрагмента>)

А вообще немного не понятна задача, + кода бы побольше, тогда разберемся.
0
barbaris
0 / 0 / 0
Регистрация: 24.09.2014
Сообщений: 5
19.11.2014, 16:20  [ТС] #3
попытаюсь больше прояснить задачу... задача состоит в том что у нас есть приложение с такой структурой рисунок структуры
при первом переходе на фрагмент с картой, она загружается отлично, но когда возвращаемся на нее то выдает ошибку:

5051-5051/yourevents.yourevents E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #169: Error inflating class fragment

at yourevents.yourevents.EventFragment.onCreateView(EventFragment.java:72)
at android.app.Fragment.performCreateView(Fragment.java:1695)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
at android.app.BackStackRecord.popFromBackStack(BackStackRecord.java:776)
at android.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1484)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:490)

Caused by: java.lang.IllegalArgumentException: Binary XML file line #169: Duplicate id 0x7f05006e, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
at android.app.Activity.onCreateView(Activity.java:4740)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)


погуглив ету ошибку, узнав что ето происходит через то что происходит конфликт карт, то есть у нас уже есть карта, а при возврате назад создается еще одна и пытается налезть на первую...
Пишут что выход в том чтобы создавать динамически карту, и добавлять ее в контейнер.
вот собственно это я и пытаюсь сделать ... вот старый код
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
public class EventFragment extends Fragment {
MapFragment mapFragment;
    GoogleMap map;
@Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_event, null);
 initMap();
}
  private void initMap() {
    if (map==null) {
 
            mapFragment =  (MapFragment ) getFragmentManager()
                    .findFragmentById(R.id.map);
            map = mapFragment.getMap();
 
                map.addMarker(new MarkerOptions()
                        .position(event.getPosition())
                        .title(event.getPlace()));
 
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(event.getPosition())
                        .zoom(17)
                        .tilt(0)
                        .build();
                CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                map.animateCamera(cameraUpdate);
 
        }
вот код обработчика кнопки по которой переходим на следующий фрагмент, с которого при возврате мы получаем ошибку
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
   visitadEventButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                EventFragmentVisited efVisited = new EventFragmentVisited();
 
                 myFragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction();
                fragmentTransaction.remove(mapFragment);
                fragmentTransaction.replace(R.id.container, efVisited);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
а так я пытаюсь решить ету проблему:
код контейнера
XML
1
2
3
4
5
6
7
8
9
10
11
       <LinearLayout
            android:id="@+id/conteiner_map"
 
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:layout_column="0"
            android:layout_row="3"
            >
 
        </LinearLayout>
код создания программно фрагмента, и добавление его в контейнер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_event, null);
 
        Context context = getActivity().getApplicationContext();
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout = (LinearLayout) view.findViewById(R.id.conteiner_map);
        FrameLayout frameLayout = new FrameLayout(context);
        frameLayout.setId(R.id.id_map_fragment);
        linearLayout.addView(frameLayout);
}
подскажите, я хоть правильно пытаюсь решить проблему ?
0
Grigoriy9
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 11
20.11.2014, 00:24 #4
Цитата Сообщение от barbaris Посмотреть сообщение
View view = inflater.inflate(R.layout.fragment_event, null);
Здесь нужно указывать
Цитата Сообщение от barbaris Посмотреть сообщение
final ViewGroup container
, а дальше в параметрах метода inflate(int id, ViewGroup parent, boolean root) root надо указать true. C
Цитата Сообщение от barbaris Посмотреть сообщение
initMap();
вроде все хорошо. После initMap нужно вернуть созданный view (
Цитата Сообщение от barbaris Посмотреть сообщение
View view
)

Для второго варианта:
Цитата Сообщение от barbaris Посмотреть сообщение
frameLayout.setId(R.id.id_map_fragment);
ТАК делать нельзя! Во-первых это ничего не даст, т.к. присваивая Framelayout какой-то id вы не ссылаетесь на объект в xml файле. Во-вторых это приведет к ошибке, т.к. android найдет 2 view элемента с одинаковыми id.
Это и видно по логам:
Цитата Сообщение от barbaris Посмотреть сообщение
Binary XML file line #169: Duplicate id 0x7f05006e
То как вы пытаетесь исправить навряд ли поможет, первоначальный вариант
Цитата Сообщение от barbaris Посмотреть сообщение
пытаюсь сделать ... вот старый код
... был лучше.

Вообще, по-моему не очень удобная штука эти фрагменты Проблема в том что они имеют свой lifecicle, и фраза
Цитата Сообщение от barbaris Посмотреть сообщение
fragmentTransaction.remove(mapFragment);
не всегда удаляет фрагмент из памяти полностью, а лишь переводит его в режим ожидания (вроде бы). Можно просто менять view'ы и обрабатывать клавишу Back.

Про фрагменты советую почитать: http://startandroid.ru/ru/uroki/vse-...ja-rabota.html
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 00:24

Задать размер кнопки программно
Здравствуйте. Возник такой вопрос: В программе я использую несколько кнопок,...

Задать программно leftMargin для RelativeLayout
Имеется заготовка view: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;...

Дизайн: как задать программно интерфейс приложения?
Здравствуйте. Расскажите мне пожалуйста как можно больше про дизайн...


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

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

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