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

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

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

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

18.11.2014, 18:55. Просмотров 748. Ответов 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);
буду благодарен за любую помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 18:55     Задать программно свойства Fragment
Посмотрите здесь:

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

Изменить свойства программно созданного элемента - Программирование Android
Проблема. Есть карта на ней маркеры список имен маркеров можно получить layers.get(i).toString() перебрав в цикле Теперь зная имена...

Задать ScrollView программно - Программирование Android
Здраствуйте! Как сделать ScrollView с элементом LinearLayout программно? Делаю одно, не работает другое... ScrollView scroll = new...

TextView задать отступ программно - Программирование Android
Программно создаю TextView . Присваиваю ему ряд значений textView.setGravity(Gravity.CENTER); textView.setMaxEms(10); ...

Задать размер кнопки программно - Программирование Android
Здравствуйте. Возник такой вопрос: В программе я использую несколько кнопок, размер которых зависит от размера экрана (не обязательно...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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);
}
подскажите, я хоть правильно пытаюсь решить проблему ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 00:24     Задать программно свойства Fragment
Еще ссылки по теме:

Программно задать сим карту для звонков - Программирование Android
Как можно программно задать сим карту для звонков? Например у меня стоит &quot;Всегда спрашивать&quot;, а когда программа включается она должна...

Программно задать цвет фона для View - Программирование Android
Возникла проблема с установкой фона для View. Получаю цвет через класс Color Код: RelativeLayout rl; @Override protected void...

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

MediaPlayer, как программно задать определенный файл на воспроизведение? - Программирование Android
собственно как работать с данным классом, и как программно задать определенный файл на воспроизведение? спасибо!

Fragment - Программирование Android
Eсть Activity состоящий из ActionBar в котором две вкладки, каждая из них это Fragment. Не пойму как при переходе ко второй вкладке...

MapFragment в Fragment - Программирование Android
Как получить MapFragment который находится в Fragment? Сейчас использую такой способ: MapFragment mapFragment =...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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