知识点:
1.fragment的添加与替换; 知识点链接
2.fragment属性public final boolean isAdded();知识点链接
如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false。
3.【Android动画】之Tween动画 (渐变、缩放、位移、旋转);知识点链接
4.setSelected知识点:知识点链接
Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解
5.system.currentTimeMillis() 获得当前的时间;知识点链接
6.TabFragment解决方案;知识点链接
错误:
1. v7包报错:E:\library_one\appcompat_v7\res\values-v21\themes_base.xml:191: error: Error:
No resource found that matches the given name: attr 'android:colorPrimaryDark'.
解决办法:导入5.0的sdk
eclipse中的v7项目: project.properties中target=android-21 意思是必须是5.0来编译
2.Type mismatch: cannot convert from FragmentAccount to Fragment
错误提示:无法将MainFragment (Fragment的子类)强制转换成Fragment
解决方法:在原来的MainFragment中把
import android.app.Fragment;
更改为:
import android.support.v4.app.Fragment;
public class MainActivity extends FragmentActivity implements FragmentInterface {
private long exitTime = 0;
public Fragment[] fragments;
private Button[] mTabs;
private int index;//代表每个页面
private int lastTabIndex;
private int currentTabIndex;// 当前页面
private FragmentAccount fragmentaccount;
private FragmentNote fragmentnote;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initTab();
}
private void initView() {
mTabs = new Button[2];
mTabs[0] = (Button) findViewById(R.id.btn_home);
mTabs[1] = (Button) findViewById(R.id.btn_channel);
mTabs[0].setSelected(true);//默认开启页面
}
private void initTab() {
fragmentaccount = new FragmentAccount();
fragmentaccount.setFragmentInterface(this);
fragmentnote = new FragmentNote();
fragmentnote.setFragmentInterface(this);
fragments = new Fragment[] { fragmentaccount, fragmentnote };
//获取一个fragment
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fragmentaccount).commit();
}
//此方法点击即可调用
public void onTabSelect(View view) {
System.out.println("onTabSelect+点击");
if (view != null) {
switch (view.getId()) {
case R.id.btn_home:
index = 0;
break;
case R.id.btn_channel:
index = 1;
break;
}
}
// fragment替换
FragmentTransaction trx = getSupportFragmentManager()
.beginTransaction();
if (lastTabIndex == 2) {
lastTabIndex = 0;
if (!fragments[index].isAdded()) {
trx.add(R.id.fragment_container, fragments[index]);
}
trx.show(fragments[index]).commit();
}
//成立则切换页面
else if (currentTabIndex != index) {
if (index > currentTabIndex) {
trx.setCustomAnimations(R.anim.slide_left_in,
R.anim.slide_left_out);
} else {
trx.setCustomAnimations(R.anim.slide_right_in,
R.anim.slide_right_out);
}
trx.hide(fragments[currentTabIndex]);
//判断fragment是否添加进入activity
if (!fragments[index].isAdded()) {
trx.add(R.id.fragment_container, fragments[index]);
}
trx.show(fragments[index]).commit();
}
//默认是否处于被选择状态
mTabs[currentTabIndex].setSelected(false);
mTabs[index].setSelected(true);
currentTabIndex = index;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (lastTabIndex == 2) {
onTabSelect(null);
return true;
}
//获取当前时间单位毫秒
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_LONG).show();
exitTime = System.currentTimeMillis();
return true;
} else {
MainActivity.this.finish();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
/**
* 用于记住fragment滑动位置及物理返回按键的分别控制
*/
@Override
public void switchSecondChannel(ChannelListener channelType) {
lastTabIndex = 2;
FragmentTransaction trx = getSupportFragmentManager()
.beginTransaction();
trx.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
trx.hide(fragments[currentTabIndex]);
}
}