Github-Client(ANDROID)オープンソースの旅(二)------ActionBarSherkLockの浅析

12319 ワード


次のブログ:http://blog.csdn.net/geniuseoe2012/article/details/8982469
Github-Clientは多くのオープンソースのサードパーティライブラリを使用しています
最初のシングルはActionBarSherklockで、Android 3からよく知られています.0からActionBarが提供され、Androidのユーザー体験が強くなったが、このActionBarはAndroid 3にある.0以下はサポートされていません.グーグルも解決策を出していませんが、できないことはありません.githubでは牛がオープンソースのActionBarShelllockを放出し、Android 2にしました.xでActionBarを実現し、Android 3であれば3.0の携帯電話で使用すると、オリジナルのActionBarが呼び出されます.次に、青先生は実際の使用例と結びつけて簡単にその使用について話します.
 
まずhttps://github.com/JakeWharton/ActionBarSherlockからソースコードをダウンロードし、ディレクトリを得る
Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock_第1张图片
 
ここでactionbarsherlockはリンクエンジニアリングとして他のエンジニアリングに参照される
Actionbarsherlock-samplesにはいくつかの例示的なエンジニアリングがありますが、実はいくつかのAPIのdemoの使用です.
これは重要です.子供靴たちはよく見て、コードに向かって例を全部走って、基本的にその使い方をマスターすることができます.
しかしdemoの例ではActionBarSherklockのオリジナルスタイルやシステム付属スタイルが多く使われています
私たちのプロジェクトには往々にして自分のスタイルがあります.これはstyle設定themeを改造する必要があります.
具体的には、サンプルエンジニアリングstyleを参照してください.その効果は次のように実行されます.
Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock_第2张图片
 
 
本稿では,網易ニュースクライアントのactionbarアプリケーションを手本に,様々な奥義を分析する.
まず効果図を
Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock_第3张图片
 
 
青先生のパクリ版
Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock_第4张图片
 
 
 
上部コードクリップ:
 
public class SliderTabPagerActivity extends SherlockFragmentActivity implements OnPageChangeListener,
												TabListener{

	private  int COUNT = 0;
	private List<DataStruct> mList;
	
	private ViewPager mViewPager;
	private LayoutInflater mInflater;
	
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);		
		setContentView(R.layout.slider_tab_pager_layout);		 
		setupViews();
		initData();
	}
	
	  
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

	
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		getSupportMenuInflater().inflate(R.menu.main_menu, menu);
	    return true;
	    
	}

	  @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	        switch (item.getItemId()) {
	        case android.R.id.home:
	        	Toast.makeText(this, "home", Toast.LENGTH_SHORT).show();
	            return true;
	        case R.id.menu_setting:
	        	Toast.makeText(this, "setting", Toast.LENGTH_SHORT).show();
	            return true;
	        default:
	            return super.onOptionsItemSelected(item);
	        }
	    }


	private void setupViews(){
		 mInflater = getLayoutInflater();
		
		 mViewPager = (ViewPager)findViewById(R.id.pager);
		 mViewPager.setOnPageChangeListener(this);

	     ActionBar actionBar = getSupportActionBar();
	     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
	     
	     String[] arrStrings = getResources().getStringArray(R.array.sections);
	     COUNT = arrStrings.length;
         for (int i = 0; i < COUNT; i++) {
        	Tab tab =  actionBar.newTab();
        	tab.setCustomView(getTabView(arrStrings[i]));
        	tab.setTabListener(this);
        	actionBar.addTab(tab);      
         }
    
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.setLogo(R.drawable.biz_pics_main_back_normal);
         actionBar.setTitle("    ");


	}
	
	private void initData(){
		mList = new ArrayList<DataStruct>();
		for(int i = 0; i < COUNT; i++){
			DataStruct struct = new DataStruct();
			struct.index = i;
			struct.daString = "tab-->" + i;
			mList.add(struct);
		}
		mViewPager.setAdapter(new SliderPagerAdapter(getSupportFragmentManager(), mList));
	}


	private View getTabView(String title){
		View view = mInflater.inflate(R.layout.tab_item_layout, null);
		TextView textView = (TextView) view.findViewById(R.id.textView);
		textView.setText(title);
		return view;
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub
		
	}



	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		// TODO Auto-generated method stub
		
	}



	@Override
	public void onPageSelected(int position) {
	      getSupportActionBar().setSelectedNavigationItem(position);
	}



	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		 mViewPager.setCurrentItem(tab.getPosition());
	}



	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}



	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}
	
	
	class SliderPagerAdapter extends FragmentStatePagerAdapter{

		private List<DataStruct> mList;
		
		public SliderPagerAdapter(FragmentManager fm, List<DataStruct> list) {
			super(fm);
			mList = list;
		}

		@Override
		public Fragment getItem(int pos) {
			return new SliderFragment(mList.get(pos));
		}

		@Override
		public int getCount() {
		
			return mList.size();
		}
		
	}

	
	public static class SliderFragment extends SherlockFragment{

		private DataStruct mStruct;
		
		public SliderFragment(DataStruct struct){
			mStruct = struct;
		}
		
		@Override
		public void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {


			View view = inflater.inflate(R.layout.layout1, null);
			TextView tView = (TextView) view.findViewById(R.id.textView);
			tView.setText(mStruct.toString());
			
			return view;
		}
		
		
	}
	
}

 
 
Sytle構成
 
 <style name="Themes.Sliders.Actionbar" parent="@style/Theme.Sherlock.Light">
        <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
    	<item name="actionBarTabStyle">@style/Widget.Slider.ActionBarTab</item> 
        <item name="actionBarItemBackground">@drawable/selector_actionbar_button</item>
        <item name="homeAsUpIndicator">@drawable/biz_widget_left</item>
        <item name="android:actionBarStyle">@style/Widget.Slider.ActionBar</item>
    	<item name="android:actionBarTabStyle">@style/Widget.Slider.ActionBarTab</item> 
    	<item name="android:actionBarItemBackground">@drawable/selector_actionbar_button</item>
        <item name="android:homeAsUpIndicator">@drawable/biz_widget_left</item>
    </style>

    
    <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">  
        <item name="android:background">@drawable/base_actionbar_bg</item>     
        <item name="android:backgroundStacked">#ffeeeeee</item>
        <item name="android:titleTextStyle">@style/TextAppearance.Slider.Widget.ActionBar.Titlen</item>
        <item name="titleTextStyle">@style/TextAppearance.Slider.Widget.ActionBar.Titlen</item>
        <item name="background">@drawable/base_actionbar_bg</item>     
        <item name="backgroundStacked">#ffeeeeee</item>
    </style>
    
     <style name="Widget.Slider.ActionBarTab" parent="@style/Widget.Sherlock.ActionBar.TabView">       
        <item name="android:background">@drawable/tab_indicator</item>
    </style>

    <style name="Widget.Slider.ActionButton" parent="@style/Widget.Sherlock.ActionButton">
        <item name="android:background">@drawable/selector_actionbar_button</item>
        <item name="background">@drawable/selector_actionbar_button</item>
    </style>
    
   <style name="TextAppearance.Slider.Widget.ActionBar.Titlen" parent="@style/TextAppearance.Sherlock.Widget.ActionBar.Title">
       <item name="android:textColor">#eeeeee</item>
       <item name="android:textSize">20sp</item>
    </style>

みんなは工事のdownをおりて注意深く比較してどれらのフィールドがどれらのUIの効果に対応することを知っています
 
もっと詳しく知りたいならActionBarSherklockプロジェクトのstyleファイルを見てください.
カスタムスタイルオリジナルスタイルを継承して対応フィールドを変更すればOK
スタイルのフィールドにはandroid接頭辞とandroid接頭辞のないフィールドがあることに注意してください.
 
 <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">  
        <item name="android:background">@drawable/base_actionbar_bg</item>     
        <item name="android:backgroundStacked">#ffeeeeee</item>
        <item name="android:titleTextStyle">@style/TextAppearance.Slider.Widget.ActionBar.Titlen</item>
        <item name="titleTextStyle">@style/TextAppearance.Slider.Widget.ActionBar.Titlen</item>
        <item name="background">@drawable/base_actionbar_bg</item>     
        <item name="backgroundStacked">#ffeeeeee</item>
    </style>

 
これは2.xでsytleを使用する場合はandroid接頭辞のないフィールドITEM、3.0以上はオリジナルのフィールドを使用しますので、どちらも値を設定しなければなりません.そうしないと、異なるシステムバージョンでは効果が得られない可能性があります
 
最後にプロジェクトリンクを添付します.
http://download.csdn.net/detail/geniuseoe2012/5535041
これからどうなるか知りたければ,次の話を聞いてみよう.
more brilliant,Please pay attention to my CSDN blog --> http://blog.csdn.net/geniuseoe2012