Как организовать приложение с помощью фрагментов?

102
9

В настоящее время я перекодирую большую часть моего андроидного приложения, чтобы ближе следовать инструкциям по дизайну. В настоящее время я использую все действия и нулевые фрагменты. Я пытаюсь переключиться на фрагменты, чтобы использовать сдвиг навигации навигации и в конечном итоге некоторые скользящие вкладки.


Для навигации прямо сейчас у меня есть это раскрывающееся меню, которое при нажатии элемента запускает новое действие:


enter image description here


Активность "Ваша статистика" похожа на домашнюю страницу, в которую пользователь также войдет в приложение. Я также хочу, чтобы пользователь мог вернуться на эту "страницу" из любого места приложения.


Моя активность, с которой я планирую запустить ничью, у меня есть макет рисования с именем fragment_main:


<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<FrameLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>

<ListView
android:id="@+id/drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#FFF"
android:choiceMode="singleChoice"/>

</android.support.v4.widget.DrawerLayout>


и моя активность, которая загружает макет ящика:


public class MainDraw extends FragmentActivity {
final String[] data ={"one","two","three"};
final String[] fragments ={
"com.beerportfolio.beerportfoliopro.FragmentOne",
"com.beerportfolio.beerportfoliopro.FragmentTwo",
"com.beerportfolio.beerportfoliopro.FragmentThree"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);

//todo: load statistics

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, data);

final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
final ListView navList = (ListView) findViewById(R.id.drawer);
navList.setAdapter(adapter);
navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
@Override
public void onDrawerClosed(View drawerView){
super.onDrawerClosed(drawerView);
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.main, Fragment.instantiate(MainDraw.this, fragments[pos]));
tx.commit();
}
});
drawer.closeDrawer(navList);
}
});
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.main,Fragment.instantiate(MainDraw.this, fragments[0]));
tx.commit();
}

}


В моем //todo: comment Мне нужно загрузить мой первый "домашний" фрагмент, который является моей страницей статистики? И тогда все остальные фрагменты будут перенесены и выйдут на основе щелчков мыши?


Спасибо за вашу помощь заранее, я хочу убедиться, что я делаю это правильно, я использовал для кодирования только для того, чтобы заставить работу работать, поэтому я теперь делаю огромный кусок моего кода. Пожалуйста, поделитесь любыми другими советами фрагментов, которые мне могут понадобиться!

спросил(а) 2021-01-27T19:39:03+03:00 8 месяцев, 3 недели назад
1
Решение
91

Прежде всего, прочитайте хорошо написанную документацию, она ответит на ваши сомнения.


Я бы поделился своим личным шаблоном для преобразования существующих Activity в Fragment


    Создайте свой абстрактный класс Фрагментов, из которого извлекаются все фрагменты ящика, это может помочь сгруппировать общие атрибуты
    Используйте метод, например selectItem() в документах, он помогает явным делать вызов при первом запуске (показывая фрагмент "home" ), а затем из onItemClick
    перемещение разметки XML с Activity.onCreate() на Fragment.onCreateView() (т.е. setContentView до inflater.inflate(R.layout.my_layout, container, false)), во многих случаях вы можете скопировать весь код с onCreate() в onCreateView
    переместите код инициализации с Activity.onCreate() на Fragment.onActivityCreated(), это очень полезно, когда существуют как Activity (включая фрагмент), так и прямой фрагмент, например, если ваше приложение предоставляет действие "Поделиться с", вы продолжаете действие Activity что внутри XML включает <fragment/>, и фрагмент может быть создан из ящика, также
    Если вам нужно связаться с Activity to Fragment и наоборот, я предлагаю создать интерфейс и сохранить его внутри 'onAttach()' (см. пример Google)

    Элементы панели действий должны быть скрыты, когда ящик открыт, снова взгляните на пример, используемый в doc, здесь очень полезен интерфейс для связи от активности к фрагменту, основное действие может определить, открыт ли ящик и фрагмент может вызвать интерфейс


    public interface FragmentActivityStatus {
    public boolean isDrawerOpen();
    }

Деятельность


    public class MainActivity extends Activity implements FragmentActivityStatus {
@Override
public boolean isDrawerOpen() {
return drawerLayout.isDrawerOpen(drawerList);
}
}

Фрагмент

    @Override
public void onAttach(Activity activity) {
super.onAttach(activity);
fragmentActivityStatus = (FragmentActivityStatus)activity;
}

@Override
public void onPrepareOptionsMenu(Menu menu) {
boolean isMenuVisible = !fragmentActivityStatus.isDrawerOpen();
menu.findItem(R.id.my_menu).setVisible(isMenuVisible);
super.onPrepareOptionsMenu(menu);
}


Не связанный с фрагментом, в вашем коде вы объявляете имена классов как строку, подумайте о создании массива Class, если вы реорганизуете пакеты, код продолжает работать, тогда вы можете вызвать Class.getName(), чтобы получить строку для передачи до Fragment.instantiate()


   final Class<?>[] fragments = {
FragmentOne.class,
FragmentTwo.class,
FragmentThree.class};

Тогда


    FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.main, Fragment.instantiate(MainDraw.this,
fragments[pos].getName()));
tx.commit();

ответил(а) 2021-01-27T19:39:03+03:00 8 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема