Listener from fragment to actvity
We need three things
– Interface
– Fragment
– Activity
We create a simple Interface:
public interface InteractionListener { void onFragmentInteraction(String string); }
Now in our fragment We need to use onAttach(Context context), called when a fragment is first attached to its context. In this method we init our listener
When the user click in button, we call our listener.
public class OurFragment extends Fragment implements View.OnClickListener{ private EditText mEditText; private InteractionListener mListener; public OurFragment() { // Required empty public constructor } public static OurFragment newInstance() { OurFragment fragment = new OurFragment(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_our, container, false); mEditText = (EditText) view.findViewById(R.id.fragment_our_edit_text); Button button = (Button) view.findViewById(R.id.fragment_our_button); button.setOnClickListener(this); return view; } public void sentString() { mListener.onFragmentInteraction(mEditText.getText().toString()); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof InteractionListener) { //init the listener mListener = (InteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement InteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } @Override public void onClick(View v) { sentString(); } }
Now in activity We implement the listener
implements InteractionListener
And then to put our method
onFragmentInteraction(String string)
public class MainActivity extends AppCompatActivity implements InteractionListener{ private static final String TAG = "MainActivity"; private MenuItem mSearchMenuItem; private SearchView mSearchView; private String mSearchString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); replaceFragment(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); mSearchMenuItem = menu.findItem(R.id.menu_main_action_search); mSearchView = (SearchView) MenuItemCompat.getActionView(mSearchMenuItem); focusSearView(); return super.onCreateOptionsMenu(menu); } public void focusSearView(){ if (mSearchString != null && !mSearchString.isEmpty()) { mSearchMenuItem.expandActionView(); mSearchView.setQuery(mSearchString, true); mSearchView.clearFocus(); } } public void replaceFragment() { Fragment OurFragment = new OurFragment().newInstance(); try { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_main, OurFragment, "tag").commit(); } catch (Exception e) { Log.d(TAG, e.toString()); } } @Override public void onFragmentInteraction(String string) { //listened mSearchString = string; focusSearView(); } }
Here activity layout:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.javier.customsearchview.MainActivity"> </RelativeLayout>
Now we create our SearchView. First we need to create new folder which name is menu.
After that we create new xml file, which name is “main”.
<?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/menu_main_action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/menu_main_search_title" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always|collapseActionView" /> </menu>
Finally fragment layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.javier.customsearchview.OurFragment"> <EditText android:id="@+id/fragment_our_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:gravity="center" /> <Button android:id="@+id/fragment_our_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/fragment_our_edit_text" android:layout_centerHorizontal="true" /> </RelativeLayout>
Pingback: Communicating between fragment and activity • The Developer World Is Yours
Very helpful, thanks!