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

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

Восстановить пароль Регистрация
 
barbaris
0 / 0 / 0
Регистрация: 24.09.2014
Сообщений: 5
18.11.2014, 18:55     Задать программно свойства Fragment #1
Доброго времени суток, я новичок в этом деле, поетому хочу попросить у вас помощи, мне нужно передать фрагменту программно свойства, у меня есть контейнер в который должно программно динамически добавляться карта
вот код в хмл
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);
буду благодарен за любую помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 18:55     Задать программно свойства Fragment
Посмотрите здесь:

Дизайн: как задать программно интерфейс приложения? Android
Android MediaPlayer, как программно задать определенный файл на воспроизведение?
Задать размер кнопки программно Android
Android Задать программно leftMargin для RelativeLayout
Android Обновление fragment из другого fragment
Программно задать сим карту для звонков Android
Задать ScrollView программно Android
Fragment Android
Программно задать цвет фона для View Android
Программно создать таблицу в Fragment Android
TextView задать отступ программно Android
Android Изменить свойства программно созданного элемента

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Grigoriy9
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 11
19.11.2014, 01:47     Задать программно свойства Fragment #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 фрагмента>)

А вообще немного не понятна задача, + кода бы побольше, тогда разберемся.
barbaris
0 / 0 / 0
Регистрация: 24.09.2014
Сообщений: 5
19.11.2014, 16:20  [ТС]     Задать программно свойства Fragment #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);
}
подскажите, я хоть правильно пытаюсь решить проблему ?
Grigoriy9
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 11
20.11.2014, 00:24     Задать программно свойства Fragment #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
Yandex
Объявления
20.11.2014, 00:24     Задать программно свойства Fragment
Ответ Создать тему
Опции темы

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