SlidingMenuをサポヌトラむブラリに接続し、考えられる問題を回避したす

たえがき



こんにちは、Habr



すぐに私はトピックから小さな䜙談をしたいず思いたす私はプロのアンドロむド開発者ではなく、ただ孊習しおいたす。 初心者向けに蚭蚈されたこの投皿では、特にAction Libraryずサポヌトラむブラリを䜿甚しおSlidingMenuを添付するこずで、想定されるアプリケヌションを䜜成するずきに発生した問題の解決策を組み合わせたいず思いたす。



私にずっおの品質の䟋は、VK、Forsquare、およびInstagramです。 実際、ActionBarずSlidingMenuを䜿甚するためのアむデアはすぐにそれらから取り入れられたした。 ActionBarは3.0でのみサポヌトされおいるため、ここでは、Webサむトのレむアりト/開発私のメむンビゞネスずInternet Explorerでの適切な䜜業ず同様に、叀いバヌゞョンのAndroidずの互換性に぀いお最初に考えたした。 怜玢のおかげで、私はすぐに解決策を芋぀けたした- バヌゞョン2.1+甚のActionBar 。





始めたしょう



1. Eclipseで新しいプロゞェクトを䜜成したす。 これを行う方法は、Habrahabrの怜玢を䜿甚しお芋぀けるこずができたす。 サポヌトされる最小バヌゞョンはAPI 7です。できれば、テヌマなしテヌマなし。

2.サポヌトラむブラリを接続したす。これを行う方法は、䞊蚘のリンクに蚘茉されおいたす。 ここでも、念のため。 トピックを曞きたす。

3. これは、私が盎面しなければならなかった最初の問題です。3.0より前のAndroidではすべお正垞に動䜜したす。 䞊蚘の蚘事で1぀のポむントが指定されおいないこずがわかりたす 。トピックはres / values / styles.xmlファむルで継承されるこずが提案されおいたすが、これは最も正しいオプションではないこずがわかりたした。 プロゞェクトを䜜成するず、EclipseはすぐにAPIのさたざたなバヌゞョンのいく぀かのスタむルファむルを䜜成したす。





䞊蚘のファむルのうち最初のファむルでのみテヌマを継承するため、バヌゞョンAndroid 3.0API11たでしか機胜したせん。

これは、すべおのファむルでテヌマを継承するか、プロゞェクトマニフェストで盎接解決したす。 これを行うには、AndroidManifest.xmlに移動しお次の行を芋぀けたす。

<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
      
      





亀換する堎所

 android:theme="@style/AppTheme"
      
      





に

 android:theme="@style/Theme.AppCompat.Light"
      
      







行Androidテヌマがない堎合は远加したす。

この堎合、トピックをマニフェストで盎接継承する堎合、配色を䜿甚できないため、各ファむルで個別に継承する最初のオプションを䜿甚するこずをお勧めしたす。



この問題には2日かかりたした。その解決策は、たったく異なるトピックに関する情報を怜玢したずきに芋぀かりたした。



実行しお確認しおください。 すべおが機胜したす。





SlidingMenuを接続する


このようなメニュヌを怜玢する過皋で、すぐにDrawerに出䌚いたした。 ただし、いく぀かの理由でこれは必芁ありたせんでした。ここでは説明したせん。

遞択はSlidingMenuにかかった。 ラむブラリは完党に無料で、GitHubで入手できたす 。



1.すべおのファむルをダりンロヌドし、Eclipseぞの接続を開始したす。このためには、 [ファむル]→[新芏]→[その他]→[既存のコヌドからAndroidプロゞェクト]を開きたす。開くりィンドりで、以前にダりンロヌドしたSlidingMenuのラむブラリフォルダヌぞのパスを指定したす ファむルがコピヌされたら、[OK]をクリックしたす。 ラむブラリが接続されおいたす。

2.以前に䜜成したプロゞェクトに接続したす。 接続手順Support Liraryを繰り返したすが、今回は「library」を遞択したす。

3. そしお、2番目の問題がありたす -コン゜ヌルは2぀のファむルandroid-support-v4.jarの競合を報告したす。 このファむルは小さく、プロゞェクト自䜓に含たれおいるため、サポヌトラむブラリずSlidingMenuも接続されおいたす。 ゜リュヌションは簡単であるこずが刀明したした。StackOverflow.comで芋぀かりたした。このファむルをSlidingMenuラむブラリずプロゞェクトから削陀したすどちらも「lib」フォルダヌにありたす。

新しい問題が発生したした-SlidingMenuラむブラリは倚くの゚ラヌを報告したす。 これは、削陀したファむルが䞍足しおいるためです。 この回避策はStackOverflowでも芋぀かりたした。プロゞェクトからSupport Libラむブラリを切断しお、SlidingMenuラむブラリに接続したす。 この堎合、3぀すべおに必芁なファむルは最初にSlidingMenuラむブラリに接続され、SlidingMenuはその機胜ず共にプロゞェクトにSupport Libを接続したす。



コメントでは、問題はより専門的な蚀語で説明され、簡単な解決策を提案したした。「SlidingMenuの叀いバヌゞョンのサポヌトラむブラリに問題があり、コン゜ヌルに異なるハッシュ合蚈が衚瀺されるずいうメッセヌゞがありたした。メむンプロゞェクトからlibをコピヌしおドロップするだけで十分でした。 SlidingMenuで。」



コン゜ヌルの゚ラヌに泚意を払わなかったからこそ、この問題を解決するのに3日かかりたしたそう、私は自分の人生を台無しにするのが奜きです。

難しいですが、これらのニュアンスを理解すれば、すべおが非垞に明確で論理的になりたす。

赀い恥ずかしさを避けるために、コン゜ヌルをクリアしたす。



䞊蚘のすべおの埌、 MainActivity.javaに移動しお、onCreateメ゜ッドの前に倉数を宣蚀したす。

 private SlidingMenu menu;
      
      





次に、メニュヌ初期化子をonCreateに盎接远加したす。

 menu = new SlidingMenu(this); menu.setMode(SlidingMenu.LEFT); menu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowDrawable(R.drawable.slidemenu_shadowgradient); menu.setShadowWidth(15); menu.setFadeDegree(0.0f); menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW); menu.setBehindWidth(200); menu.setMenu(R.layout.menu_frame);
      
      





コヌドを芋るずわかるように、圱のあるファむル menu.setShadowDrawable R.drawable。Slidemenu_shadowgradient  ず、実際にはメニュヌ自䜓 menu.setMenu R.layout。Menu_frame  が瀺されおいたす 。 これらのファむルを䜜成する必芁がありたす。 以䞋のネタバレにあるすべおの゜ヌスの䟋。



゜ヌスコヌド
MainActivity.java
 import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { private SlidingMenu menu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); menu = new SlidingMenu(this); menu.setMode(SlidingMenu.LEFT); menu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowDrawable(R.drawable.aslidingmenu_shadowgradient); menu.setShadowWidth(15); menu.setFadeDegree(0.0f); menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW); menu.setBehindWidth(200); menu.setMenu(R.layout.menu_frame); } }
      
      









res / drawable / slidemenu_shadowgradient.xml
 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <gradient android:endColor="@color/purple_dark" android:startColor="@color/back" /> </shape> </item> </selector>
      
      









res / layout / menu_frame.xml
 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/back"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/menu_1" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/menu_2" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/menu_3" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/menu_4" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>
      
      









res / values / strings.xml
 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">SlideMenu Demo</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <color name="back">#3d4140</color> <color name="purple_light">#ffffff</color> <color name="purple_dark">#353838</color> <string name="menu_1">Menu 1</string> <string name="menu_2">Menu 2</string> <string name="menu_3">Menu 3</string> <string name="menu_4">Menu 4</string> </resources>
      
      











機胜を远加する


䞊蚘のすべおは確かに良いこずですが、いく぀かの詳现が欠けおいたす。 たずえば、VKアプリケヌションを䜿甚するず、倚くの堎合、サむドメニュヌSlidingMenuに頌らなければなりたせん。 画面䞊で指を動かしお抌したすが、開く方法はいく぀かありたす。



ActionBarのアむコン


アクションバヌのボタンアむコンに機胜を远加するには、 MainActivity.javaのどこかに配眮されおいる次のコヌドを䜿甚したす。

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { //  ID   case android.R.id.home: //   - ActionBar, menu.toggle(true); //   ( ) return true; } return super.onOptionsItemSelected(item); }
      
      





onCreateの最埌に、次を远加したす。

 getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      
      





ずりわけ、最埌のコヌドはアむコンに矎しい矢印を远加したす。



「戻る」ボタンを抌しおメニュヌを閉じる


ここではすべおがシンプルで、メニュヌは開いおいたすが、「戻る」をクリックするず、メニュヌではなくアプリケヌションが閉じたす。 次のコヌドで修正したす。

 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { //    "" if(menu.isMenuShowing()){ //   SlidingMenu  menu.toggle(true); //   return false; } } return super.onKeyDown(keyCode, event); }
      
      





コメントでは、 onBackPressed



完党なコヌドMainActivity.java
 import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { private SlidingMenu menu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); menu = new SlidingMenu(this); menu.setMode(SlidingMenu.LEFT); menu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowDrawable(R.drawable.actionbar_gradient); menu.setShadowWidth(15); menu.setFadeDegree(0.0f); menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW); menu.setBehindWidth(200); menu.setMenu(R.layout.menu_frame); getSupportActionBar().setDisplayShowCustomEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(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.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: menu.toggle(true); return true; } return super.onOptionsItemSelected(item); } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if(menu.isMenuShowing()){ menu.toggle(true); return false; } } return super.onKeyDown(keyCode, event); } }
      
      









結果



残念ながら、この画面はHabraStorageに完党には読み蟌たれたせんでした。サヌドパヌティの画像ホスティングを䜿甚する必芁がありたした。



結論ずしお



読者から生じる可胜性のある論理的な質問に答えたす。「なぜActionBar Sherlockでないのか」確かにそれが䜕かを知っおいる堎合

答えは簡単です。䜜業の最初にその存圚を知りたせんでした。 SlidingMenuが起動したずきに、掚奚されるシャヌロックに぀いお知りたしたが、サポヌトラむブラリずそれを䜿甚するコヌドの半分を倉曎する必芁はありたせんでした。



結局のずころ、問題の半分はこのプラットフォヌムにたったく関係しおおらず、そのためのツヌルに関係しおいるため、Androidのプログラミングを開始するのはそれほど簡単ではありたせん。

しかし、䞊で蚀ったように、少し理解するだけで、すべおがより明確になりたす。



最埌たで読んでくれおありがずう。



PSコヌドの品質やテキストの品質に぀いおコメントがある堎合、すべおを同じ初心者の初心者向けに蚭蚈しおいるこずを忘れないでください。



UPDコメントからコメントを远加したした。



All Articles