Android 프로그래밍 경험 - ActionBar+Fragment+ViewPager를 사용하여 Menu 효과를 동적으로 전환
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를 표시하고 전환하는 데 사용된다. 의문이 있으면 모두 함께 교류하는 것을 환영한다.
이 예의 모든 소스 코드는 여기를 클릭하여 옮겨 싣고 출처를 밝혀 주십시오. 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.