0

У меня есть ящик для навигации с фрагментами. Во всех фрагментах он показывает элемент кнопки с общим доступом в 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

Пожалуйста, определите, что я должен сделать, чтобы получить нужный мне результат.

Если вы находите мой вопрос непонятным, тогда вы можете свободно комментировать!

Заранее благодарен!

ответ

1

В этой строке исключение NullPointerException означает, что MenuItem с идентификатором R.id.action_share не может быть найден. Это нормально, потому что ваш IntroductionFragment, в методе onCreateOptionsMenu(), называет:

menu.clear() 

, который удалит все элементов из меню (в том числе ранее добавленный основной R.id.action_share MenuItem), что делает FindItem () для возврата null. Решение было бы удалить эту строку menu.clear() (вы должны объяснить, почему вы используете clear()).

+0

Спасибо, кстати Я решил NullPointer ех, давая если условие, как вы можете увидеть в onPrepareOptionsMenu. См. Мой вопрос редактирования! –

+0

, используя menu.clear, очищает элемент 'main.xml' из-за того, что ничего не отображается в стенограмме фрагмента, но согласно моей реализации searchview видна в действии не в фрагменте –

+1

@VivekWarde На каких версиях вы тестируете? Если тестирование в более низких версиях вы следовали за http://developer.android.com/guide/topics/ui/actionbar.html#ActionView (см. Определение xml)? Не понятно, что вы делаете: в вашем основном действии есть элемент общего доступа, так что вы хотите, чтобы это было доступно, несмотря ни на что?И любой другой фрагмент, который вы покажете (например, IntroductionFragment), имеет элемент меню, который он добавляет к ActionBar? – Luksprog

0

Другой вариант, который вы могли бы сделать, поскольку у меня была такая же проблема с SearchView (минус тот факт, что код уродливый) - это сделать что-то вроде этого. У меня есть несколько исправлений, чтобы обновить этот проект позже сегодня, но это хорошая база.

В основном вы создаете ActionLayout с AutoCompleteTextView или EditText в качестве поля поиска, и вы можете вручную обрабатывать все действия, необходимые для открытия и закрытия диалоговых окон.

https://github.com/sinfonianartist/AutoCompleteActionBarDemo

Смежные вопросы