У меня есть ящик для навигации с фрагментами. Во всех фрагментах он показывает элемент кнопки с общим доступом в main.xml
.Изменить элемент панели действий для поиска в фрагменте навигационного ящика
фрагмент по умолчанию PhotoFragment
, показывающий долю элемент main.xml
& при IntroductionFragment
нажатии на панель навигации, панель действий, то должны показывать SearchView элемент, который находится в search.xml
MainActivity.java
public class MainActivity extends ActionBarActivity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SpannableString s = new SpannableString(getTitle());
s.setSpan(new TypefaceSpan(this, "BOOKOS.TTF"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(s);
setContentView(R.layout.activity_main);
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], 1));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],1));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], 1));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], 1));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], 1));
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], 1));
// Recycle the typed array
// navMenuIcons.recycle();
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
// enabling action bar app icon and behaving it as toggle button
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
){
@SuppressLint("NewApi")
public void onDrawerClosed(View view) {
SpannableString s = new SpannableString(mTitle);
s.setSpan(new TypefaceSpan(getApplicationContext(), "BOOKOS.TTF"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(s);
// getSupportActionBar().setTitle(mTitle);
// calling onPrepareOptionsMenu() to show action bar icons
supportInvalidateOptionsMenu();
}
@SuppressLint("NewApi")
public void onDrawerOpened(View drawerView) {
SpannableString s = new SpannableString(mDrawerTitle);
s.setSpan(new TypefaceSpan(getApplicationContext(), "BOOKOS.TTF"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(s);
// getSupportActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
supportInvalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
// displayView(0);
}
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
displayView(7);
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
@SuppressLint("NewApi")
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new IntroductionFragment();
break;
case 1:
fragment = new PrefaceFragment();
break;
case 2:
fragment = new PreambleFragment();
break;
case 3:
fragment = new ContentsFragment();
break;
case 4:
fragment = new SchedulesFragment();
break;
case 5:
fragment = new AppendixFragment();
break;
case 6:
fragment = new AmendmentFragment();
break;
case 7:
fragment = new PhotoFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
ActionProvider mActionProvider;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if(Flag.f==0)
{
getMenuInflater().inflate(R.menu.main, menu);
// Find the share item
MenuItem shareItem = menu.findItem(R.id.action_share);
// Need to use MenuItemCompat to retrieve the Action Provider
mActionProvider = (ActionProvider)
MenuItemCompat.getActionProvider(shareItem);
}
else
{
getMenuInflater().inflate(R.menu.search, menu);
// Find the share item
MenuItem searchItem = menu.findItem(R.id.search);
// Need to use MenuItemCompat to retrieve the Action Provider
mActionProvider = (ActionProvider)
MenuItemCompat.getActionProvider(searchItem);
// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
MenuItemCompat.setOnActionExpandListener(searchItem, new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
});
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_share:
Intent ints=new Intent(this,ShareActivity.class);
startActivity(ints);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/***
* Called when invalidateOptionsMenu() is triggered
*/@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
if(Flag.f==0)
menu.findItem(R.id.action_share).setVisible(!drawerOpen);
else
menu.findItem(R.id.search).setVisible(!drawerOpen);
Flag.f=0;
return super.onPrepareOptionsMenu(menu);
}
@SuppressLint("NewApi")
@Override
public void setTitle(CharSequence title) {
SpannableString s = new SpannableString(mTitle);
s.setSpan(new TypefaceSpan(this, "BOOKOS.TTF"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTitle = title;
getSupportActionBar().setTitle(s);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
Вот как я реализовал класс фрагмента, чтобы получить searchView от search.xml
, который я не могу показать на панели действий
public class IntroductionFragment extends Fragment{
public IntroductionFragment(){
setRetainInstance(true);
this.setHasOptionsMenu(true);
}
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_introduction,container,false);
...
...
getActivity().supportInvalidateOptionsMenu();
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.v("inside onCreateOptionsMenu","???????");
Flag.f=1;
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.search, menu);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_introduction, null);
ViewGroup rootView = (ViewGroup) getView();
rootView.removeAllViews();
rootView.addView(view);
}
}
Search.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/search"
android:title="@string/search_hint"
android:showAsAction="always|collapseActionView"
yourapp:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
Это то, что я пытался!
Использование menu.clear()
очищает элемент main.xml
& вместо этого я не вижу SearchView в IntroductionFragment
Пожалуйста, определите, что я должен сделать, чтобы получить нужный мне результат.
Если вы находите мой вопрос непонятным, тогда вы можете свободно комментировать!
Заранее благодарен!
Спасибо, кстати Я решил NullPointer ех, давая если условие, как вы можете увидеть в onPrepareOptionsMenu. См. Мой вопрос редактирования! –
, используя menu.clear, очищает элемент 'main.xml' из-за того, что ничего не отображается в стенограмме фрагмента, но согласно моей реализации searchview видна в действии не в фрагменте –
@VivekWarde На каких версиях вы тестируете? Если тестирование в более низких версиях вы следовали за http://developer.android.com/guide/topics/ui/actionbar.html#ActionView (см. Определение xml)? Не понятно, что вы делаете: в вашем основном действии есть элемент общего доступа, так что вы хотите, чтобы это было доступно, несмотря ни на что?И любой другой фрагмент, который вы покажете (например, IntroductionFragment), имеет элемент меню, который он добавляет к ActionBar? – Luksprog