Android 프로그래밍 경험 - ActionBar+Fragment+ViewPager를 사용하여 Menu 효과를 동적으로 전환

8057 단어
1. 먼저 효과도를 올린다
2. 본 사례에서 실현된 효과는 주로 현재 페이지에 여러 개의 페이지가 있을 때 Fragment 전환을 할 때 서로 다른 Menu 양식을 이용하여 현재 Fragment의 내용과 협조하여 복용성을 크게 높일 수 있다. 효과도를 본 다음에 내가 이 효과를 실현하는 주요 절차를 소개한다.
2.1 여기에 세 가지 스타일이 있기 때문에res/menu 폴더에 세 개의 파일을 만들어야 합니다,style1.xml,style2.xml,style3.xml.여기 나는 스타일로.xml을 예로 들면 구체적인 텍스트 아이콘 파일은 필요에 따라 스타일2.xml,style3.xml 유사.
style1.xml 소스는 다음과 같습니다.


    


2.2res/layout 파일에서 각각activity와fragment의 대응하는 보기 파일을 만듭니다. 저는Activity와 그 중 하나의Fragment를 예로 들면 나머지는 하나를 꼽을 수 있습니다.
activity_main.xml 소스


 
        
    
    

fragment_first 소스


	


2.3 다음은 논리가 실현되었다. 효과에 따라 나는 주 논리인Activity와 세 개의 Fragment 논리 파일을 만들어야 한다. 여기서 나는 똑같이 하나의 Fragment를 예로 들면 나머지 두 개는 유사하다.
FirstFragment 소스:
package com.yqc.menuswitchdemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstFragment extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		
		View rootView = inflater.inflate(R.layout.fragment_first, container,
				false);

		return rootView;
	}
	

}

여기서 Fragment를 사용할 때는 다음과 같은 사용자 정의 어댑터가 필요합니다.
package com.yqc.menuswitchdemo;



import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class LFFragmentPagerAdapter extends FragmentPagerAdapter {
	Fragment[] fragmentArray;
	
	public LFFragmentPagerAdapter(FragmentManager fm,Fragment[] fragmentArray2) {
		super(fm);
		// TODO Auto-generated constructor stub
		if (null == fragmentArray2) {
			this.fragmentArray = new Fragment[] {};
		} else {
			this.fragmentArray = fragmentArray2;
		}
	}

	
	@Override
	public Fragment getItem(int arg0) {
		// TODO Auto-generated method stub
		return fragmentArray[arg0];
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return fragmentArray.length;
	}

}

마지막으로, MainActivity 소스:
package com.yqc.menuswitchdemo;

import android.os.Bundle;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

/**
 * @author YangQiCong     QQ  90733929     
 */
public class MainActivity extends FragmentActivity {

	private ViewPager viewPager;
	private ActionBar actionBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		viewPager = (ViewPager) findViewById(R.id.viewpager);
		Fragment fragment1 = new FirstFragment();
		Fragment fragment2 = new SecondFragment();
		Fragment fragment3 = new ThirdFragment();
		Fragment[] fragmentArray = new Fragment[] { fragment1, fragment2,
				fragment3 };
		LFFragmentPagerAdapter adapter = new LFFragmentPagerAdapter(
				getSupportFragmentManager(), fragmentArray);

		viewPager.setAdapter(adapter);
		viewPager.setOffscreenPageLimit(3);
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				System.out.println("arg0:" + arg0);
				actionBar.setSelectedNavigationItem(arg0);
			}

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

			}

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

			}
		});

		actionBar = getActionBar();
		//   ActionBar      : Tab  
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		// actionBar.get

		Tab tab1 = actionBar.newTab().setText("  1")
				.setIcon(android.R.drawable.ic_menu_agenda)
				.setTabListener(new ActionTabListener(fragment1));

		Tab tab2 = actionBar.newTab().setText("  2")
				.setIcon(android.R.drawable.ic_menu_agenda)
				.setTabListener(new ActionTabListener(fragment2));

		Tab tab3 = actionBar.newTab().setText("  3")
				.setIcon(android.R.drawable.ic_menu_agenda)
				.setTabListener(new ActionTabListener(fragment3));

		actionBar.addTab(tab1);
		actionBar.addTab(tab2);
		actionBar.addTab(tab3);

	}

	class ActionTabListener implements ActionBar.TabListener {

		//   Fragment

		private Fragment fragment;

		//          Fragment

		public ActionTabListener(Fragment fragment) {
			this.fragment = fragment;
		}

		@Override
		public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
			// TODO Auto-generated method stub
			// ft.add(android.R.id.content, fragment, null);
			mType = tab.getPosition();
			System.out.println("tab.getPosition():" + tab.getPosition());
			viewPager.setCurrentItem(tab.getPosition());
			invalidateOptionsMenu();
		}

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

		}

	}

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

	private int mType;

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub

		System.out.println("  mType:" + mType);
		menu.clear();
		MenuInflater inflater = this.getMenuInflater();
		switch (mType) {
		case 0:
			inflater.inflate(R.menu.style1, menu);
			break;

		case 1:
			inflater.inflate(R.menu.style2, menu);
			break;

		case 2:
			inflater.inflate(R.menu.style3, menu);
			break;
		}
		return super.onPrepareOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		switch (item.getItemId()) {
		case R.id.action_item1:
			Toast.makeText(this, "        ", Toast.LENGTH_SHORT).show();
			break;
		case R.id.action_item2:
			Toast.makeText(this, "        ", Toast.LENGTH_SHORT).show();
			break;
		case R.id.action_item3:
			Toast.makeText(this, "        ", Toast.LENGTH_SHORT).show();
			break;
		}

		return super.onOptionsItemSelected(item);
	}

}

3. 주의해야 할 것은MainActivity 주 논리에서 나의 mType은 표지량으로 현재 Fragment를 표시하고 전환하는 데 사용된다. 의문이 있으면 모두 함께 교류하는 것을 환영한다.
이 예의 모든 소스 코드는 여기를 클릭하여 옮겨 싣고 출처를 밝혀 주십시오. 감사합니다!

좋은 웹페이지 즐겨찾기