Android - SearchView не работает во фрагменте, представленном в MainActivity - PullRequest
0 голосов
/ 09 апреля 2020

Здравствуйте, у меня есть MainActivity, которая состоит из двух фрагментов, один из которых является домашним, а другие уведомления.

Когда приложение открывается по умолчанию, отображается фрагмент Home. У моего приложения есть панель навигации, которая поставляется с панель приложения по умолчанию, где все пункты меню раздуты.

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

HomeFragment. java

public class HomeFragment extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private HomeFragment.OnFragmentInteractionListener mListener;
    private RecyclerView rv;
    private FirebaseAuth fba;
    private List<PostActivity> postItems;

    private FirebaseUser user;
    private Toolbar toolbar;


    private PostAdapter pa;

    public static HomeFragment newInstance(String param1, String param2) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    public HomeFragment() {
        // Required empty public constructor
    }



   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_home, container, false);



        user = FirebaseAuth.getInstance().getCurrentUser();

       fba = FirebaseAuth.getInstance();

//       dr = FirebaseDatabase.getInstance().getReference().child("Chat_Profiles");


            rv =view.findViewById(R.id.rvPostItems);
            LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());

            rv.setLayoutManager(layoutManager);
            layoutManager.setReverseLayout(true);
            layoutManager.setStackFromEnd(true);
           postItems = new ArrayList<>();



       rv.addItemDecoration(new DividerItemDecoration(rv.getContext(), DividerItemDecoration.VERTICAL));

           loadPosts();
            registerForContextMenu(rv);



        return view;
    }


    public void loadPosts() {

        DatabaseReference dr = FirebaseDatabase.getInstance().getReference("Posts");


        dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                postItems.clear();

                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    PostActivity pac = ds.getValue(PostActivity.class);

                    postItems.add(pac);
                    pa = new PostAdapter(postItems, getActivity());
                    rv.setAdapter(pa);
                    pa.notifyDataSetChanged();


                }


            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getActivity(), "Failed !", Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void searchPosts(String query){

        DatabaseReference dr = FirebaseDatabase.getInstance().getReference("Posts");


        dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                postItems.clear();

                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    PostActivity pac = ds.getValue(PostActivity.class);

                    if(pac.getDesc().toLowerCase().contains(query.toLowerCase())) {
                        postItems.add(pac);
                    }
                    pa = new PostAdapter(postItems, getActivity());
                    rv.setAdapter(pa);
                    pa.notifyDataSetChanged();

                }


            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getActivity(), "Failed !", Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {


        inflater.inflate(R.menu.main,menu);

        MenuItem searchPosts = menu.findItem(R.id.searchPosts);



        SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchPosts);
        /*searchView.setIconified(true);
        SearchManager searchManager = (SearchManager)  getActivity().getSystemService(Context.SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));*/
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                if(!TextUtils.isEmpty(s))
                    searchPosts(s);
                else
                    loadPosts();
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                if(!TextUtils.isEmpty(s))
                    searchPosts(s);
                else
                    loadPosts();
                return false;
            }
        });

        super.onCreateOptionsMenu(menu, inflater);

    }



    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof HomeFragment.OnFragmentInteractionListener) {
            mListener = (HomeFragment.OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }


    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }

}

MainActivity. java

public class MainActivity extends AppCompatActivity
        implements 
        ,HomeFragment.OnFragmentInteractionListener
        ,NotificationFragment.OnFragmentInteractionListener{



    private FirebaseAuth fba;
    private FirebaseUser user;
    private TextView welcomeUser;
    private DatabaseReference dr;
    private String name, thumb;
    private Toolbar toolbar;
    private MaterialSearchView msv;
    private FloatingActionButton addPost;
    private HomeFragment homeFragment;
    private NotificationFragment notificationFragment;
    private BottomNavigationView bnv;
    private ImageView navImg;
    private MenuItem itemToHide;
    private Menu postsMenu = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fba = FirebaseAuth.getInstance();

        /*if(!fba.getCurrentUser().isEmailVerified()){
            fba.getCurrentUser().updateEmail(fba.getCurrentUser().getEmail());
            fba.getCurrentUser().sendEmailVerification();
        }*/

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        getSupportActionBar().setTitle("Newsy");
        addPost = findViewById(R.id.add_post_btn);
        addPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,AddPost.class);
                startActivity(intent);
            }
        });


        if (!(fba.getCurrentUser().isEmailVerified()) || fba.getCurrentUser() == null) {
            startActivity(new Intent(this, LoginScreen.class));
        }

        /*if(fba.getCurrentUser()==null ){
            startActivity(new Intent(this,LoginScreen.class));
        }*/


        ConnectionDetector cd = new ConnectionDetector(this);
        if(cd.isConnected()){
            Toast.makeText(this,"Connection Established !",Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this,"Your phone is Offline,Check your connection !",Toast.LENGTH_LONG).show();
        }

        user = fba.getCurrentUser();
        String id = user.getUid();
        dr = FirebaseDatabase.getInstance().getReference().child("Chat_Profiles").child(id);



        //ConstraintLayout cl = (ConstraintLayout)findViewById(R.id.LoginScreen);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        if (drawer != null) {
            drawer.addDrawerListener(toggle);
        }
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);


        dr = FirebaseDatabase.getInstance().getReference().child("Chat_Profiles").child(fba.getCurrentUser().getUid());


        if (navigationView != null) {
            navigationView.setNavigationItemSelectedListener(this);

            View nav_header = navigationView.getHeaderView(0);


            dr.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    name = dataSnapshot.child("name").getValue().toString();
                    thumb = dataSnapshot.child("image").getValue().toString();

                    CircleImageView circle = (CircleImageView) nav_header.findViewById(R.id.navImg);
                    Picasso.get().load(thumb).placeholder(R.drawable.default_avatar).into(circle);


                    welcomeUser = (TextView) nav_header.findViewById(R.id.WelcomeUser);

                    welcomeUser.setText(name);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

        //add this line to display menu1 when the activity is loaded
        displaySelectedScreen(pappuLayout);
        Menu menu = navigationView.getMenu();

        MenuItem mt = menu.findItem(nav_gallery);
        mt.setTitle("News 2");

        MenuItem mt2 = menu.findItem(nav_camera);
        mt2.setTitle("News 1");

        MenuItem mt3 = menu.findItem(nav_sub);
        mt3.setTitle("Subscribe !");


        //FRAGMENTS MAIN PAGE
        bnv = findViewById(R.id.bottomNavigationView2);


        homeFragment = new HomeFragment();
        replaceFragment(new HomeFragment());

        bnv.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                int itemId = item.getItemId();
                if (itemId == R.id.bottomHome) {

                    replaceFragment(homeFragment);
                    return true;
                } else if (itemId == R.id.bottomNotification) {
                    notificationFragment = new NotificationFragment();
                    replaceFragment(notificationFragment);
                    return true;
                }
                return false;


            }
        });

    }



    @Override
    protected void onStart() {
        super.onStart();
        FirebaseUser user = fba.getCurrentUser();


        String id = user.getUid();
        SharedPreferences sp = getSharedPreferences("USER", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("Current_User", id);
        editor.apply();

        Intent intent = new Intent(getBaseContext(), MyUnityPlugin.class);
        intent.putExtra("id", id);


        dr.child("onlineStatus").setValue("true");




    }

    @Override
    protected void onStop() {
        super.onStop();
        FirebaseUser user = fba.getCurrentUser();


        dr.child("onlineStatus").setValue(ServerValue.TIMESTAMP);



    }


    @Override
    public void onBackPressed() {

        int count = getSupportFragmentManager().getBackStackEntryCount();

        if (count == 0) {
            super.onBackPressed();

        } else {
            getSupportFragmentManager().popBackStack();
        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);


        return true;
    }

    @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.LogOut) {
            fba.signOut();
            finish();
            startActivity(new Intent(this,LoginScreen.class));
            return true;
        }else if(id==R.id.settings){
            startActivity(new Intent(this,ProfileActivity.class));
            return true;
        }else if(id==R.id.users){
            startActivity(new Intent(this,Users.class));
            return true;
        }else if(id==R.id.search){

            startActivity(new Intent(this,Users.class));
            return true;
        } else if (id == R.id.notificationSettings) {
            startActivity(new Intent(this, SettingsActivity.class));
            //startActivity(new Intent(this,UnityPlayerActivity.class));
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        displaySelectedScreen(item.getItemId());

        return true;
    }

    private void displaySelectedScreen(int itemId) {

        //creating fragment object
        Fragment fragment = null;

        //initializing the fragment object which is selected
        if (itemId == R.id.nav_gallery) {
            fragment = new GalleryFrag();
        } else if (itemId == R.id.nav_camera) {
            fragment = new CameraFrag();
        } else if (itemId == R.id.nav_sub) {
            fragment = new Subscribe();
        } else if (itemId == R.id.nav_chat) {
            fragment = new Chat();
        } else if (itemId == R.id.nav_send) {
            Intent i = new Intent(MainActivity.this, UnityPlayerActivity.class);

            startActivity(i);
        }


        //replacing the fragment
        if (fragment != null) {
            ConstraintLayout fl = (ConstraintLayout) findViewById(pappuLayout);
            fl.removeAllViews();
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(pappuLayout, fragment).commit();

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(drawer_layout);
        if (drawer != null) {
            drawer.closeDrawer(GravityCompat.START);
        }
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }

    private void replaceFragment(Fragment fragment){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.postPage,fragment);
        ft.addToBackStack(null);
        ft.commit();
    }

}

main. xml (меню XML file)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    >
    <item
        android:id="@+id/search"
        android:title="Search"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_action_search"
        android:iconTint="#fff"
        app:showAsAction="ifRoom"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        android:visible="false"
        >

    </item>

    <item
        android:id="@+id/searchPosts"
        android:title="Search"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_action_search"
        android:iconTint="#fff"
        app:showAsAction="ifRoom"
        app:actionViewClass="androidx.appcompat.widget.SearchView"

        >

    </item>


    <item
        android:id="@+id/notificationSettings"
        android:icon="@drawable/baseline_settings_applications_white_18dp"
        android:orderInCategory="100"
        android:title="Settings"
        app:showAsAction="ifRoom">

    </item>


    <item
        android:id="@+id/LogOut"
        android:orderInCategory="100"
        android:title="Log Out"
        app:showAsAction="never" />

    <item
        android:id="@+id/settings"
        android:title="My Profile! "
        >

    </item>

    <item
        android:id="@+id/users"
        android:title="All users"
        >

    </item>
</menu>


...