рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдмреАрдЪ, рдЕрдВрддрд┐рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рд╡реГрддреНрддрд┐ рд░рд╣реА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╢рд╛рд░рд╛ рдкрд╣рдЪрд╛рди рдкрд░ рд╡рд┐рд╢реЗрд╖ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реБрдЖред рдЗрд╢рд╛рд░реЗ рд╕рд╣рдЬ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИрдВ, рд╡реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдмрдврд╝рддреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣реИред рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╢реНрд╡ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкрд░ рдПрдХ
рд▓реЗрдЦ рдкрд╣рд▓реЗ Habr├й рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╛рд░реНрд╢реНрд╡ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╣реБрдд рдХрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдзреАрдореА рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред рдореИрдВ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛: рдЦреЛрдЬ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ
рдПрдХреНрдЯреЗрдВрд╕рдХрдВрдЯреЗрдВрдЯ рд╡реНрдпреВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ рдЙрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬреЛ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдЦреБрдж рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж, рдпрд╣ рдореЗрд░реА рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕рд╛рдЗрдб рдореЗрдиреВ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдФрд░ рдЗрд╢рд╛рд░реЗ рд╕реЗ рдореЗрдиреВ рдЦреЛрд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЛрдиреЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдХреА рдУрд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЙрди рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЦреЛрд▓рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реЗрдЦ рдЗрддрдирд╛ рд╡рд┐рд╢рд╛рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдмрд╕ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╕рд╛рдЗрдб рдореЗрдиреВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рд╣рдо рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдордЧреНрд░реА рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдореЗрдиреВ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
рдЕрдВрд╢реЛрдВ рдХрд╛ рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЙрдирдХреЗ рдЕрдВрджрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рдд рдХреЛ рд╡реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдирдХ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣рдо рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛ рджреЗрдВрдЧреЗ; рдЬрдм рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдЯреБрдХрдбрд╝рд╛ рд╣реА рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреБрдХрдбрд╝реЗ рдХреЛ рдореЗрдиреВ рдореЗрдВ рдЦреЛрд▓рдиреЗ / рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рд╣реА рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЯреБрдХрдбрд╝реЗ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
import android.support.v4.app.Fragment; public interface SideMenuListener { public void startFragment(Fragment fragment); public boolean toggleMenu(); }
рд╣рдо рдЗрд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity implements SideMenuListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startFragment(Fragment fragment) {
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлреНрд░реИрдЧрдореЗрдВрдЯ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
import android.support.v4.app.Fragment; public class ContentFragment extends Fragment { protected void startFragment(Fragment fragment) { ((SideMenuListener) getActivity()).startFragment(fragment); } protected boolean toggleMenu() { return ((SideMenuListener) getActivity()).toggleMenu(); } }
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдЕрдВрд╢реЛрдВ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред
рдорд╛рд░реНрдХрдЕрдк рдмрдирд╛рдПрдВ, рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдЕрдм рд╣рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдореЗрдиреВ рдХреЛ рд╕реНрд╡рдпрдВ рдЕрдиреБрдХрд░рдг рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рднрд░рддреА рд╣реИред рд╣рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЧрддрд┐рд╡рд┐рдзрд┐ рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ:
<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" android:background="#888" > <ListView android:id="@+id/menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout>
рд╕рд╛рде рд╣реА рдЗрд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
private String[] names = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView menu = (ListView) findViewById(R.id.menu); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names); menu.setAdapter(adapter); }
рдЕрднреА рд╣рдорд╛рд░реЗ рдЯреБрдХрдбрд╝реЗ рдмрдирд╛рдПрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВ:
import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class TestFragment extends ContentFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.test_fragment, container, true); Button toogle = (Button) v.findViewById(R.id.toggle); toogle.setOnClickListener( new OnClickListener() { public void onClick(View arg0) { toggleMenu(); } }); return v; } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#CCC" > <Button android:id="@+id/toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Toggle" /> </RelativeLayout>
рдЗрд╕ рдмрдЯрди рдХреЗ рджреНрд╡рд╛рд░рд╛, рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рд╣рдо рдореЗрдиреВ рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ рдпрд╛ рдмрдВрдж рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ:
public class MainActivity extends FragmentActivity implements SideMenuListener { private String[] names = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; private FragmentTransaction fragmentTransaction; private View content; private int contentID = R.id.content; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); content = findViewById(contentID);
рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд░рд┐рдгрд╛рдореА рдЕрдВрд╢ рдЬреЛрдбрд╝реЗрдВ:
<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" android:background="#888" > <ListView android:id="@+id/menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> <fragment android:id="@+id/content" android:name="com.habr.sidemenu.TestFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout>
рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рдЖрдк рдкрд╛рд░реНрд╢реНрд╡ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдЗрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдЯреЙрдЧрд▓рдореЗрдиреВ () рд╡рд┐рдзрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ, рдореЗрдиреВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ рдЦреЛрд▓рддрд╛ рдпрд╛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдореЗрдВ рдЙрд╕ рд╕рдордиреНтАНрд╡рдп рдХрд╛ рдореВрд▓реНтАНрдп рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрдиреВ "рдкрд╣реБрдВрдЪ" рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдХреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреМрдбрд╝рд╛рдИ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлреЛрди рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдпрдВ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рднреА рдЙрдЪрд┐рдд рд╣реИред
рддреЛ:
public class MainActivity extends FragmentActivity implements SideMenuListener { private final double RIGTH_BOUND_COFF = 0.75; private static int DURATION = 250; private boolean isContentShow = true; private int rightBound;
рдЕрдм рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛, рдЬреЛ рдореЗрдиреВ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдХреНрд░реЛрд▓рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд░реНрдЧ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдФрд░ рдСрдлрд╕реЗрдЯ рдореВрд▓реНрдп рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рд╕реНрдХреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдереНрд░реЗрдб рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЦреБрдж рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╣рддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдорд┐рд▓реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, Scroller рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢рд╛рдпрдж рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдирдВрдд рд▓реВрдк рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
OpenMenu () рдФрд░ closeMenu () рддрд░реАрдХреЗ рдореЗрдиреВ рдЦреЛрд▓рдиреЗ / рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реНрдЯрд╛рд░реНрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдлрд╝реНрд▓рд┐рдВрдЧ () рд╡рд┐рдзрд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд┐рдлреНрдЯ рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИред
рдлрд╝реНрд▓рд┐рдВрдЧ () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░реЛрд▓рд░ рдХреА рдЙрд▓рдЯреА рдЧрд┐рдирддреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдзрд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдереНрд░реЗрдб рдХреА рд╡рд┐рдзрд┐ () рд╡рд┐рдзрд┐ рджреЛ рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИ:
- рдЬрдмрдХрд┐ рдПрдиреАрдореЗрд╢рди рдореМрдЬреВрдж рд╣реИ, View.scrollTo () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдмрд╛рдж рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреБрди: рдЕрдкрдиреЗ рдзрд╛рдЧреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
рджрд░рдЕрд╕рд▓, рд╡рд░реНрдЧ рдХреЛ рд╣реА рдЖрдВрддрд░рд┐рдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
private class ContentScrollController implements Runnable { private final Scroller scroller; private int lastX = 0; public ContentScrollController(Scroller scroller) { this.scroller = scroller; } public void run() { if (scroller.isFinished()) return; final boolean more = scroller.computeScrollOffset(); final int x = scroller.getCurrX(); final int diff = lastX - x; if (diff != 0) { content.scrollBy(diff, 0); lastX = x; } if (more) content.post(this); } public void openMenu(int duration) { isContentShow = false; final int startX = content.getScrollX(); final int dx = rightBound + startX; fling(startX, dx, duration); } public void closeMenu(int duration) { isContentShow = true; final int startX = content.getScrollX(); final int dx = startX; fling(startX, dx, duration); } private void fling(int startX, int dx, int duration) { if (!scroller.isFinished()) scroller.forceFinished(true); if (dx == 0) return; if (duration <= 0) { content.scrollBy(-dx, 0); return; } scroller.startScroll(startX, 0, dx, 0, duration); lastX = startX; content.post(this); } }
рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕реЗ рдлреАрд▓реНрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЯреЙрдЧрд▓ рдореЗрдВ рднрд░рдирд╛ рд╣реИ ():
public class MainActivity extends FragmentActivity implements SideMenuListener { private ContentScrollController menuController;
рд╣реЛ рдЧрдпрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рд╛рдЗрдб рдореЗрдиреВ рд╣реИ рдЬреЛ рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдЦреБрд▓рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдмрдЧ - рдЦрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП рдореЗрдиреВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрдЧ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдВрдЧрд▓реА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЦрдВрдб рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
public class MainActivity extends FragmentActivity implements SideMenuListener { private Rect contentHitRect = new Rect();
рдЕрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдореА рд╕рд╛рдЗрдб рдореЗрдиреВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреЛрди рдкрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕рдорд╛рдзрд╛рди рд╣реИред
рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рддреИрдпрд╛рд░ рд╕реНрд░реЛрдд рдХреЛрдб
SideMenuListener.java package com.habr.sidemenu; import android.support.v4.app.Fragment; public interface SideMenuListener { public void startFragment(Fragment fragment); public boolean toggleMenu(); }
ContentFragment.java package com.habr.sidemenu; import android.support.v4.app.Fragment; public class ContentFragment extends Fragment { protected void startFragment(Fragment fragment) { ((SideMenuListener) getActivity()).startFragment(fragment); } protected boolean toggleMenu() { return ((SideMenuListener) getActivity()).toggleMenu(); } }
TestFragment.java package com.habr.sidemenu; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class TestFragment extends ContentFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.test_fragment, container, true); Button toogle = (Button) v.findViewById(R.id.toggle); toogle.setOnClickListener( new OnClickListener() { public void onClick(View arg0) { toggleMenu(); } }); return v; } }
MainActivity.java package com.habr.sidemenu; import android.graphics.Rect; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.DecelerateInterpolator; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Scroller; public class MainActivity extends FragmentActivity implements SideMenuListener { private String[] names = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; private FragmentTransaction fragmentTransaction; private View content; private int contentID = R.id.content; private final double RIGTH_BOUND_COFF = 0.75; private static int DURATION = 250; private boolean isContentShow = true; private int rightBound; private ContentScrollController menuController; private Rect contentHitRect = new Rect(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); content = findViewById(contentID); menuController = new ContentScrollController(new Scroller(getApplicationContext(), new DecelerateInterpolator(3))); DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); rightBound = (int) (displaymetrics.widthPixels * RIGTH_BOUND_COFF); content.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { v.getHitRect(contentHitRect); contentHitRect.offset(-v.getScrollX(), v.getScrollY()); if (contentHitRect.contains((int)event.getX(), (int)event.getY())) return true; return v.onTouchEvent(event); } }); ListView menu = (ListView) findViewById(R.id.menu); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names); menu.setAdapter(adapter); } public void startFragment(Fragment fragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(contentID, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } public boolean toggleMenu() { if(isContentShow) menuController.openMenu(DURATION); else menuController.closeMenu(DURATION); return isContentShow; } private class ContentScrollController implements Runnable { private final Scroller scroller; private int lastX = 0; public ContentScrollController(Scroller scroller) { this.scroller = scroller; } public void run() { if (scroller.isFinished()) return; final boolean more = scroller.computeScrollOffset(); final int x = scroller.getCurrX(); final int diff = lastX - x; if (diff != 0) { content.scrollBy(diff, 0); lastX = x; } if (more) content.post(this); } public void openMenu(int duration) { isContentShow = false; final int startX = content.getScrollX(); final int dx = rightBound + startX; fling(startX, dx, duration); } public void closeMenu(int duration) { isContentShow = true; final int startX = content.getScrollX(); final int dx = startX; fling(startX, dx, duration); } private void fling(int startX, int dx, int duration) { if (!scroller.isFinished()) scroller.forceFinished(true); if (dx == 0) return; if (duration <= 0) { content.scrollBy(-dx, 0); return; } scroller.startScroll(startX, 0, dx, 0, duration); lastX = startX; content.post(this); } } }
activity_main.xml <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" android:background="#888" > <ListView android:id="@+id/menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> <fragment android:id="@+id/content" android:name="com.habr.sidemenu.TestFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout>
test_fragment.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#CCC" > <Button android:id="@+id/toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Toggle" /> </RelativeLayout>
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛