Я столкнулся с проблемой при реализации searchview на панели действий основного действия ... где основное действие имеет нижнее навигационное меню с тремя фрагментами ...
, и представление поиска должно работать с каждым фрагментом...
открытый класс MainActivity расширяет AppCompatActivity, реализует SearchView.OnQueryTextListener {
private Boolean LoadContact = false ;
private BottomNavigationView navigationView ;
private String SearchText;
int page;
AllContactFrag allContactFrag = new AllContactFrag();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle("Special Contact");
navigationView =(BottomNavigationView) findViewById(R.id.navigationView);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frame, new SpecialContactFrag());
ft.commit();
// navigationView.setSelectedItemId();
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch (id)
{
case R.id.action_MyNotes:
Bundle bundle = new Bundle();
bundle.putString("text",SearchText);
Fragment AllNotes = new NotesFrag();
AllNotes.setArguments(bundle);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.frame,AllNotes);
transaction.addToBackStack(null);
transaction.commit();
toolbar.setTitle("My Note");
return true;
case R.id.action_AllContact:
Bundle bundle2 = new Bundle();
bundle2.putString("text",SearchText);
Fragment AlxlContact = new AllContactFrag();
AlxlContact.setArguments(bundle2);
FragmentManager xmanager = getSupportFragmentManager();
FragmentTransaction xtransaction = xmanager.beginTransaction();
xtransaction.replace(R.id.frame,AlxlContact);
xtransaction.addToBackStack(null);
xtransaction.commit();
toolbar.setTitle("Phone Contact");
return true;
case R.id.action_Spec:
Fragment AlxxlContact = new SpecialContactFrag();
FragmentManager xxmanager = getSupportFragmentManager();
FragmentTransaction xxtransaction = xxmanager.beginTransaction();
xxtransaction.replace(R.id.frame,AlxxlContact);
xxtransaction.addToBackStack(null);
xxtransaction.commit();
toolbar.setTitle("Special Contact");
return true;
}
return true;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
MenuItem menuItem = menu.findItem (R.id.search);SearchView searchView = (SearchView) menuItem.getActionView ();searchView.setSearchableInfo (searchManager.getSearchableInfo (getComponentName ()));
searchView.setOnQueryTextListener(this);
return true;
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onQueryTextSubmit(String query) {
int id = navigationView.getSelectedItemId();
switch (id)
{
case R.id.action_MyNotes:
Fragment NoteFrgment = new NotesFrag();
((NotesFrag) NoteFrgment).onQueryTextSubmit(query);
case R.id.action_AllContact:
Fragment AllCont = new AllContactFrag();
((AllContactFrag) AllCont).onQueryTextSubmit(query);
return true;
case R.id.action_Spec :
Fragment Spec = new SpecialContactFrag();
((SpecialContactFrag) Spec).onQueryTextSubmit(query);
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// Toast.makeText(getBaseContext(),newText,Toast.LENGTH_LONG).show();
SearchText = newText ;
int id = navigationView.getSelectedItemId();
switch (id)
{
case R.id.action_MyNotes:
Fragment NoteFrgment = new NotesFrag();
((NotesFrag) NoteFrgment).onQueryTextChange(newText);
case R.id.action_AllContact:
AllContactFrag AllCont = (AllContactFrag)getSupportFragmentManager().findFragmentById(R.id.frame);
((AllContactFrag) AllCont).onQueryTextChange(newText);
return true;
case R.id.action_Spec :
Fragment Spec = new SpecialContactFrag();
((SpecialContactFrag) Spec).onQueryTextChange(newText);
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
allContactFrag.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/* public class SectionsPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragmentList = new ArrayList<>();
List<String> fragmentListTitle = new ArrayList<>();
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if(LoadContact){
return fragmentList.get(position);
}else {
return fragmentList.get(position);
}
}
@Override
public int getCount() {
return fragmentList.size();
}
public void AddFragment(Fragment fragment, String fragmentTitle)
{
fragmentList.add(fragment);
fragmentListTitle.add(fragmentTitle);
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentListTitle.get(position);
}
}
*/
}
//
@Override
public boolean onQueryTextChange(String newText) {
// Toast.makeText(getBaseContext(),newText,Toast.LENGTH_LONG).show();
SearchText = newText ;
int id = navigationView.getSelectedItemId();
switch (id)
{
case R.id.action_MyNotes:
Fragment NoteFrgment = new NotesFrag();
((NotesFrag) NoteFrgment).onQueryTextChange(newText);
case R.id.action_AllContact:
AllContactFrag AllCont = (AllContactFrag)getSupportFragmentManager().findFragmentById(R.id.frame);
((AllContactFrag) AllCont).onQueryTextChange(newText);
return true;
case R.id.action_Spec :
Fragment Spec = new SpecialContactFrag();
((SpecialContactFrag) Spec).onQueryTextChange(newText);
}
return true;
}
// во фрагменте
@Override
public boolean onQueryTextSubmit(String s) {
Log.d("", "onQueryTextSubmit: ");
search_list = new ArrayList<>();
search_list.clear();
Context context = getContext();
db = new dbhandler(mcontext);
phoneList = new ArrayList<>();
phoneList = db.getAllPhoneContact();
String name;
contact contact = new contact();
for (int i = 0; i < phoneList.size(); i++)
{
contact = phoneList.get(i);
name = phoneList.get(i).getName();
if(name.contains(s))
{
search_list.add(contact);
}
}
allConAdapter = new AllConAdapter(getActivity(),search_list, 0);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(allConAdapter);
allConAdapter.notifyDataSetChanged();
return true ;
}
private Context mcontext;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mcontext = context ;
Log.d("", "onAttach: ");
}
у фрагмента в onQueryTextSubmit значение контекста становится нулевым, поэтому приложение вылетает, потому что я хочу прочитать данные из SQLite, а контекст - ноль