Ответ 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);
}
}