Как открыть новый фрагмент из навигационного ящика?

Я использую руководства для разработчиков для разработчиков. Я выбрал "Навигация: навигационный ящик", когда я создал новый проект в Android Studio. Я искал в Интернете ответы на мои вопросы, но я не могу найти ничего такого. Извините, я новичок в программировании.

  • Как заставить приложение открывать новый фрагмент в главном представлении при нажатии в ящике навигации?
  • Можно ли открывать несколько фрагментов с возможностью прокрутки с вкладками при нажатии в ящике навигации?
  • Как сделать "заголовок" расширяемым/сворачиваемым?

http://developer.android.com/design/patterns/navigation-drawer.html http://developer.android.com/training/implementing-navigation/nav-drawer.html

Вот как я хочу, чтобы макет был таким:

My layout

title_section * not section_title;)

Ответ 1

Навигационный ящик - новый и трендовый дизайн в наши дни. Мы используем два макета: макет основного контента и макет списка ящиков при разработке xml.layout(макет) для активности ящика навигации. Здесь я отвечаю на все ваши глупые вопросы.

Как заставить приложение открыть новый фрагмент в главном представлении, когда щелчок в ящике навигации?

просто добавьте clicklistener в элементы списка ящиков и замените фрагменты в основном содержимом в зависимости от позиции щелчка элемента списка.

Пример кода:

    // The click listener for ListView in the navigation drawer
    @SuppressWarnings("unused")
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
    }

    private void selectItem(int position) {

        Fragment newFragment;
        FragmentTransaction transaction = getFragmentManager().beginTransaction();

        switch (position) {
        case 0:
            newFragment = new f1();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            break;

        case 1:
            newFragment = new f2();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            break;

        case 2:
            newFragment = new f3();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            break;

        case 3:
            newFragment = new f4();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            break;  


        }
        //DrawerList.setItemChecked(position, true);
        setTitle(ListTitles[position]);
        DrawerLayout.closeDrawer(DrawerList);   
    }

Здесь f1, f2. f3 и f4 - разные фрагменты, каждый из которых имеет свой собственный макет. вам нужно создать для них отдельные классы Java, наследуя класс фрагмента.

Можно ли открывать несколько фрагментов с возможностью прокрутки с вкладками при нажатии в ящике навигации?

Чтобы реализовать вкладки внутри фрагмента, вы можете использовать табус внутри этого конкретного фрагмента. Предположим, вы хотите добавить вкладки в фрагмент f_main.

макет для F_main.xml

<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:orientation="horizontal" />

        <FrameLayout
            android:id="@+id/tabFrameLayout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

</TabHost>

Затем создайте другие фрагменты f_tab1 и f_tab2 с соответствующими макетами и java-классами. Макеты для двух фрагментов вкладки могут быть одинаковыми или разными. здесь я беру их одинаковый или общий макет.

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView android:id="@+id/google_map"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="MAP"/>

    </LinearLayout>

Код для фрагмента F_tab1.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class F_tab1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.friends_list, container,false);


        return view;
    }

}

Код для другого фрагмента. i.e F_tab2.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class F_tab2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.friends_list, container,false);


        return view;
    }

}

Теперь просто используйте clicklistener в списке ящиков, как упоминалось ранее, чтобы загрузить F_main на элемент, щелкнув в списке ящиков, который будет дополнительно загружать вкладки в fmmnet F_main в основном представлении содержимого.

Как сделать "заголовок" расширяемым/сворачиваемым?

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

Как описано в руководстве по проектированию навигационного ящика, вы должны изменить содержимое панели действий при видимости ящика, например, изменить название и удалить элементы действия, которые являются контекстуальными для основного содержимого. Следующий код показывает, как вы можете сделать это, переопределив методы обратного вызова DrawerLayout.DrawerListener с экземпляром класса ActionBarDrawerToggle следующим образом

 public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...

        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
    }