Динамический интерфейс с раздвижным меню и панелью действий

Попытка добиться динамического интерфейса с помощью facebook, например, скользящего меню и actionbarsherlock . Сначала я смотрю документацию по Android, в которой вводят фрагмент для обработки динамической кнопки. Но без везения и недели, я все равно не могу заставить его работать в любом случае, я думаю, это мое недоразумение в концепции Android. Скользящая панель и actionbarsherlock работают без проблем.

У меня есть HomeScreen.java, которые содержат все мое меню и этап предварительной настройки, и до сих пор я создал pagerAdapter1.java, который расширяет FragmentPagerAdapter и три примера класса фрагмента, которые обрабатывают мою работу, которая является task1.java, task2.java, task3.java Достаточно просто

Вот часть моего кода HomeScreen.java

import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.slidingmenu.lib.SlidingMenu; import com.slidingmenu.lib.app.SlidingFragmentActivity; public class HomeScreen extends SlidingFragmentActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home_screen); setBehindContentView(R.layout.menu_frame); } 

PagerAdapter1.java

 public class PagerAdapter1 extends FragmentPagerAdapter { private List<Fragment> fragments; public PagerAdapter1(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } public Fragment getItem(int position) { return this.fragments.get(position); } public int getCount() { return this.fragments.size(); } } 

И три task1.java, 2,3

  import android.support.v4.app.Fragment; public class Tab1Fragment extends Fragment{ onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } return (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); } 

Я думаю, что лучше объяснить мою проблему с изображением

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

домашний экран

И это мое меню

menu_frame

Моя проблема заключается в том, как включить этот 3 фрагмента в мой рабочий стол? Я пробовал так много учебников, но это не работает в моей ситуации. Большинство учебников создают фрагмент с кодом, я просто хочу включить в него мою 3 задачи

Solutions Collecting From Web of "Динамический интерфейс с раздвижным меню и панелью действий"

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

Это ListFragment вашего BehindContent (SlidingMenu):

 public class ColorMenuFragment extends ListFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.list, null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String[] colors = getResources().getStringArray(R.array.color_names); ArrayAdapter<String> colorAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, colors); setListAdapter(colorAdapter); //This array is only to fill SlidingMenu with a Simple String Color. //I used MergeAdapter from Commonsware to create a very nice SlidingMenu. } @Override public void onListItemClick(ListView lv, View v, int position, long id) { //This switch case is a listener to select wish item user have been selected, so it Call //ColorFragment, you can change to Task1Fragment, Task2Fragment, Task3Fragment. Fragment newContent = null; switch (position) { case 0: newContent = new ColorFragment(R.color.red); break; case 1: newContent = new ColorFragment(R.color.green); break; case 2: newContent = new ColorFragment(R.color.blue); break; case 3: newContent = new ColorFragment(android.R.color.white); break; case 4: newContent = new ColorFragment(android.R.color.black); break; } if (newContent != null) switchFragment(newContent); } // the meat of switching the above fragment private void switchFragment(Fragment fragment) { if (getActivity() == null) return; if (getActivity() instanceof FragmentChangeActivity) { FragmentChangeActivity fca = (FragmentChangeActivity) getActivity(); fca.switchContent(fragment); } else if (getActivity() instanceof ResponsiveUIActivity) { ResponsiveUIActivity ra = (ResponsiveUIActivity) getActivity(); ra.switchContent(fragment); } } } 

Вот ваш класс BaseActivity:

У меня нет проворства, как я мог понять, вам это не нужно.

 public class FragmentChangeActivity extends BaseActivity { private Fragment mContent; public FragmentChangeActivity() { super(R.string.changing_fragments); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set the Above View if (savedInstanceState != null) mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent"); if (mContent == null) mContent = new ColorFragment(R.color.red); // set the Above View //This will be the first AboveView setContentView(R.layout.content_frame); getSupportFragmentManager() .beginTransaction() .replace(R.id.content_frame, mContent) .commit(); // set the Behind View //This is the SlidingMenu setBehindContentView(R.layout.menu_frame); getSupportFragmentManager() .beginTransaction() .replace(R.id.menu_frame, new ColorMenuFragment()) .commit(); // customize the SlidingMenu //This is opcional getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, "mContent", mContent); } public void switchContent(Fragment fragment) { // the meat of switching fragment mContent = fragment; getSupportFragmentManager() .beginTransaction() .replace(R.id.content_frame, fragment) .commit(); getSlidingMenu().showContent(); } } 

Итак, если вы хотите изменить ColorFragment на что-нибудь еще, сделайте следующее:

Сначала выберите элемент, который вы хотите использовать:

 case 0: newContent = new ColorFragment(R.color.red); break; 

чтобы:

 case 0: newContent = new ArrayListFragment(); break; 

Я сделал только арраиста, это просто простой пример, вы можете многое сделать, тогда вы можете прочитать о Фрагменте, чтобы узнать, как делать разные вещи.

  public class ArrayListFragment extends ListFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, Listnames.TITLES)); //Listnames is a class with String[] TITLES; } @Override public void onListItemClick(ListView l, View v, int position, long id) { Log.i("FragmentList2", "Item clicked: " + id); String item = (String) getListAdapter().getItem(position); Toast.makeText(getActivity(), item, Toast.LENGTH_LONG).show(); } } 

Ну, если вы что-то неправильно поняли, просто скажите мне.

Моя проблема заключается в том, как включить этот 3 фрагмента в мой рабочий стол?

Это действительно зависит от того, как вы хотите, чтобы они вели себя.

Вы хотите, чтобы они появлялись только по одному, не позволяя им перебираться между ними? Если да, то добавьте / вставьте макет контейнера (например, простой FrameLayout ) в свою Activity на котором вы добавите Fragments . Я не работал с библиотекой SlidingMenu но при вызове одного из элементов в меню он должен иметь обратный вызов. В этом FrameLayout вы присоедините соответствующий фрагмент к макету контейнера ( FrameLayout ), о котором я упоминал ранее.

Вы хотите показать только один фрагмент, но вы хотите разрешить пользователю пронести между ними? Если да, используйте ViewPager в макете активности и в SlidingMenu вызванном SlidingMenu меню библиотеки SlidingMenu , установите текущую страницу ViewPager с помощью метода setCurrentItem() .

Если вы хотите что-то другое, то это даст более подробную информацию.

Большинство учебников создают фрагмент с кодом, я просто хочу включить в него 3 задачи

Этого я не совсем понимаю. Если вы хотите «включить» ваши фрагменты задач непосредственно в свой макет xml, вы можете, но вы будете ограничены тем, что вы можете с ними сделать (не говоря уже о том, что все фрагменты будут на одном экране), и я бы избегал Это. Если вы хотите, чтобы что-то еще предоставило более подробную информацию.

Я не думаю, что так будет работать с Fragments, я тоже искал решение и в итоге добавлял фрагменты вручную.

Я работаю над чем-то подобным, но для меня также был случай открытия WebViews для назначенных URL-адресов. Таким образом, экран «выше» всегда будет обновляться при каждом нажатии.

Чтобы контролировать поведение этого, я создал объект MenuItemResource , который в основном сохраняет свойства, такие как идентификатор значка, имя элемента меню и URL-адрес.

 public class MenuItemResource { private int aValue; private int aUrl; private int aIconIdle; private int aIconActive; public MenuItemResource(int value, int url, int iconIdle, int iconActive) { aValue = value; aUrl = url; aIconIdle = iconIdle; aIconActive = iconActive; } } 

Поведение обрабатывается с помощью OnItemClickListener который проверяет с помощью переключателя, какие значения находятся в щелчке на MenuItemResource . Для WebView это довольно просто:

  newFragment = new WebViewFragment(); final Bundle arguments = new Bundle(); arguments.putString(Constants.KEY_URL, getString(item.getUrl())); newFragment.setArguments(arguments); startFragment(newFragment, false); // boolean is used to add the fragment to the backstack 

Метод startFragment просто использует FragmentManager и FragmentTransaction для замены текущего Fragment . Это работает одинаково для других MenuItemResources которые запускают регулярные фрагменты.

  newFragment = new Task1Fragment(); startFragment(newFragment, false); 

Я не отношусь к фрагментам в MenuItemResource (пока), но он работает очень хорошо для URL-адресов и WebView. Фрагменты начинаются на основе value в MenuItemResource Я не уверен, как вы относитесь к фрагментам, как вы делали в комментариях (Task1.java и т. Д.), Так как вы не запускаете их с помощью Intents like Activities . Кроме того, я не уверен, почему вы хотели бы сделать это динамически для Fragments (я могу представить, что этот случай является динамическим для WebViews), поскольку их нужно компилировать в любом случае, поэтому мои пункты меню добавляются вручную.