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

Xamarin

Войти
Регистрация
Восстановить пароль
 
user20011993
11 / 11 / 0
Регистрация: 19.10.2012
Сообщений: 470
#1

Архитектура приложения - Xamarin

29.08.2016, 16:15. Просмотров 501. Ответов 5
Метки нет (Все метки)

всем привет.
в приложении используется несколько фрагментов (из библиотек Android.Support.V7 и Android.Support.V4). на них есть кнопки, которые должны вызывать другие фрагменты. чтобы показать фрагмент, нужно сначала спрятать текущий. информация о всех фрагментах, и какой из них текущий-содержится в mainactivity. получается, что фрагмент должен а)иметь доступ к методам mainactivity, которые меняют фрагменты, b)иметь доступ к инструментам, которые находятся не в mainactivity, но имеют такой же функционал.

код mainactivity
C#
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
namespace Global.Droid
{
    [Activity (Label = "Global.Droid", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/Theme.AppCompat")]
    public class MainActivity : ActionBarActivity
    {        
        private FrameLayout mFragmentContainer;
        private SupportFragment mCurrentFragment;
 
        private MainPageFragment mainPage;
        private TestFrag testFrag;
        
        private Stack<SupportFragment> fragStack;
 
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.Main);
 
            testFrag = new TestFrag();
            mainPage = new MainPageFragment(); 
            fragStack = new Stack<SupportFragment>();
                        
            mFragmentContainer = FindViewById<FrameLayout>(Resource.Id.fragmentContainer);
            var trans = SupportFragmentManager.BeginTransaction();
            trans.Add(Resource.Id.fragmentContainer, mainPage, "Main Page");
            trans.Add(Resource.Id.fragmentContainer, testFrag, "Test Page");
            trans.Hide(testFrag);
            trans.Commit();
            
            }
 
        public void ShowFragment(SupportFragment fragment)
        {
            var trans = SupportFragmentManager.BeginTransaction();
            fragment.View.BringToFront();
            mainPage.View.BringToFront();
 
            trans.AddToBackStack(null);
            fragStack.Push(mainPage);
 
            trans.Hide(mainPage);
            trans.Show(fragment);
 
            trans.Commit();
        }       
    }  
}
код фрагмента с кнопками
(тут мы может обрабатывать event, происходящие в этом фрагменте. отловить тык по нужной кнопке. но тут мы не может реализовать переключение фрагмента, т.к. не можем наследовать фрагмент от ActionBarActivity)
C#
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
public class MainPageFragment : Android.Support.V4.App.Fragment
    {       
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
 
        }
 
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.GridLayout, container, false);
 
            ImageView imageM = view.FindViewById<ImageView>(Resource.Id.imageViewF);
            AnimationDrawable animationM = (AnimationDrawable)imageM.Drawable;
 
            Button startB = view.FindViewById<Button>(Resource.Id.buttonStart);
            Button stopB = view.FindViewById<Button>(Resource.Id.buttonStop);
            Button testFragment = view.FindViewById<Button>(Resource.Id.buttonFragment);
                 
            startB.Click += delegate { animationM.Start(); };
            stopB.Click += delegate { animationM.Stop(); };
            
            return view;
        }
    }
я пытался сделать в mainactivity public метод для отображения конкретного фрагмента, но в результате получаю только null exception на фрагменте, который нужно показать.
как можно реализовать механизм, который позволял бы отлавливать в одном месте все события клика, либо как можно сделать доступной из всех фрагментов информацию обо всех фрагментах, и методы их переключения?
спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2016, 16:15     Архитектура приложения
Посмотрите здесь:

Архитектура приложения - Программирование iOS
Здравствуйте, хочу написать приложение для iphone, которое каждый день выводит на экран несколько слов из русско-английского словаря для...

Архитектура приложения - Java SE
Всем привет! Создаю гуи приложение и встал вопрос архитектуры. Допустим есть класс MenuBar и MainWindow. Например, по нажатия кнопки в...

Архитектура приложения - Программирование Android
К примеру есть 2 экрана 1 - основной 2 - экран настроек лучше создавать их как 2 активности? (чтобы из экрана настроек можно было...

Архитектура приложения - C#
Существует литература по построению архитектуры приложений?

Архитектура приложения - C#
Всем привет! Пытаюсь разобраться в следующих вопросах. есть приложение C# ( но это не важно ) которое взаимодействует с база данных...

Архитектура приложения - C# MVC
На курсовую необходимо разработать такое приложение, чтобы на отдельном уровне был back-end (сервер базы данных ???) , который содержит...

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

Архитектура приложения - C++ Qt
Можете мне объяснить, поделиться своими идеями об реализации приложения, а точнее какой архитектуры придерживаться... 1) Чтобы можно...

Архитектура приложения - ActionScript
День добрый! :) Мысль создать своё, хоть и очень простенькое вк приложение еще сохранилась. Азы, вроде, узнал и опробовал на практике....

Архитектура приложения - C++ Qt
Приветствую! Не могли бы Вы посоветовать литературу по разработке sdi/mdi приложений, предполагающих активное взаимодействие с...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
user20011993
11 / 11 / 0
Регистрация: 19.10.2012
Сообщений: 470
30.08.2016, 16:29  [ТС]     Архитектура приложения #2
в этой занимательной статье почти нашел ответ на свой вопрос - в вызванном фрагменте описываем интерфейс, в вызвавшей активити его реализуем и получаем обратную связь. но получается такая штука у меня: первый фрагмент с основным контентом вызывается из мейн активити, а следующий фрагмент-из этого "первого" фрагмента. допустим можно объявить еще один интерфейс во втором фрагменте, реализовать его в первом, и получить обратную связь уже между фрагментами. допустим получилось. но это ж совсем херня какая-то не правильно я считаю. можно ли изобрести более правильный метод решения проблемы?
lvlkoo
.NET C#,ASP.NET MVC
334 / 290 / 101
Регистрация: 16.10.2010
Сообщений: 1,290
Завершенные тесты: 2
31.08.2016, 21:48     Архитектура приложения #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Чтото у вас както все запутано. Как делаю я: в активити методы для обработки\показа фрагмента. Передаете созданный экземпляр активити в конструктор фрагмента, и вызываете метод в нужный момент

C#
1
2
3
4
5
6
7
8
//activity
 
public void ShowMyFragment()
{
    var transaction = SupportFragmentManager.BeginTransaction();
    var fragment = new MyFragment(this)
    transaction.Replace(holder, fragment)
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//fragment
private Context _context;
 
//constructor
public MyFragment(Context context)
{
    _context = context;
}
 
//show other fragment
privat void ShowOtherFragment()
{
    var _activity = (MainActivity) _context;
    _activity.ShowSomeFragment();
}
user20011993
11 / 11 / 0
Регистрация: 19.10.2012
Сообщений: 470
01.09.2016, 15:15  [ТС]     Архитектура приложения #4
lvlkoo, интересное решение. такое пока не находил.
а если нужно нажать кнопку во фрагменте, и по этому клику показать другой? фрагменты ведь меняет активити, но она не может слушать события в фрагменте. и фрагмент не может использовать метод, который находится внутри активити. Application.ActivityLifecycleCallbacks вроде как позволяется получать доступ к мейн активити. сделал у себя такую штуку, но в итоге я получаю доступ только к главному фрагменту.
получается что все механизмы в главной активности, но к ней сложно получить доступ.
в фрагменте вроде такие действия нельзя делать-там нужно наследоваться от активности. а наследовать фрагмент и активность одновременно нельзя.
но щас попробую
lvlkoo
.NET C#,ASP.NET MVC
334 / 290 / 101
Регистрация: 16.10.2010
Сообщений: 1,290
Завершенные тесты: 2
01.09.2016, 17:05     Архитектура приложения #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
user20011993, я же вам написал как вызывать методы активити из фрагмента. Передавайте во фрагмент саму активити. На событие кнопки подписывайтесь во фрагменте, в событии вызывайте метод из активити как показано выше!
user20011993
11 / 11 / 0
Регистрация: 19.10.2012
Сообщений: 470
05.09.2016, 17:01  [ТС]     Архитектура приложения #6
lvlkoo, вот я кретин! как я сразу не понял? читал-перечитывал. просто ужас... вы сэкономили мне такую тучу времени, а я по своей тупости это все прошляпил... спасибо огромное!
Yandex
Объявления
05.09.2016, 17:01     Архитектура приложения
Ответ Создать тему
Опции темы

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