BottomNavigationView+ViewPager+Fragment框架
欢迎登录界面结束之后,进入主界面。主界面使用BottomNavigationView+ViewPager+Fragment框架。
代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.****.**.MainActivity">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.example.****.**.NoSlidingViewPaper
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottom_navigation">
</com.example.****.**.NoSlidingViewPaper>
</LinearLayout>
</FrameLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigation" />
</LinearLayout>
MainActivity.java
import android.app.Service;
import android.content.*;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.Toast;
import android.app.PendingIntent;
import com.example.****.**.Manage.ItemManageFragment;
import com.example.****.**.Parameters.ParametersFragment;
import com.example.****.**.Projects.ProjectsFragment;
import com.example.****.**.Scan.MainFragment;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static android.os.SystemClock.sleep;
public class MainActivity extends AppCompatActivity
implements MainFragment.OnFragmentInteractionListener,
ParametersFragment.OnFragmentInteractionListener,
ProjectsFragment.OnFragmentInteractionListener,
ItemManageFragment.OnListFragmentInteractionListener {
private MenuItem menuItem;
private ViewPager mViewPager;
private BottomNavigationView navigation;
private MenuItem lastItem; // 上一个选中的item
private ItemManageFragment itemManageFragment;
private ParametersFragment parametersFragment;
private MainFragment mainFragment;
private ProjectsFragment projectsFragment;
private ViewPager.OnPageChangeListener mOnPageChangeListener
= new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Vibrate();
if (menuItem != null) {
menuItem.setChecked(false);
} else {
navigation.getMenu().getItem(0).setChecked(false);
}
menuItem = navigation.getMenu().getItem(position);
switch (menuItem.getItemId()) {
case R.id.navigation_home:
break;
case R.id.navigation_param:
break;
case R.id.navigation_dashboard:
break;
case R.id.navigation_notifications:
break;
}
menuItem.setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (lastItem != item) { // 判断当前点击是否为item自身
lastItem = item;
switch (item.getItemId()) {
case R.id.navigation_home:
mViewPager.setCurrentItem(0);
break;
case R.id.navigation_param:
mViewPager.setCurrentItem(1);
break;
case R.id.navigation_dashboard:
mViewPager.setCurrentItem(2);
break;
case R.id.navigation_notifications:
mViewPager.setCurrentItem(3);
break;
}
}
return true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 保持屏幕常量
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Bundle bundle = this.getIntent().getExtras();
mStatus = bundle.getString("status");
// BottomNavigationView
navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
lastItem = navigation.getMenu().getItem(0);
// ViewPager
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(5);
mViewPager.addOnPageChangeListener(mOnPageChangeListener);
setupViewPager(mViewPager);
// 接收HTTP返回信息
HttpConnection.getInstance().setHandler(mHandler);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//判断其他Activity启动本Activity时传递来的intent是否为空
if (intent != null) {
//获取intent中对应Tag的布尔值
boolean isExist = intent.getBooleanExtra("exist", false);
//如果为真则退出本Activity
if (isExist) {
this.finish();
System.exit(0);
}
}
}
@Override
public void onFragmentInteraction(Uri uri) {
}
@Override
public void onFragmentInteraction(Map<String, Object> listItem) {
Toast.makeText(this, (String) listItem.get("title"), Toast.LENGTH_LONG).show();
}
@Override
public void onListFragmentInteraction(DummyContent4Manage.DummyItem4Manage item) {
switch (item.tag) {
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
}
private void setupViewPager(ViewPager viewPager) {
mainFragment = new MainFragment();
parametersFragment = new ParametersFragment();
projectsFragment = new ProjectsFragment();
itemManageFragment = new ItemManageFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//构造适配器
List<Fragment> fragments = new ArrayList<>();
fragments.add(mainFragment);
fragments.add(parametersFragment);
fragments.add(projectsFragment);
fragments.add(itemManageFragment);
FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
//设定适配器
viewPager.setAdapter(adapter);
ft.commit();
}
// 震动
private void Vibrate() {
//设置震动器
Vibrator vibrator = (Vibrator) MainActivity.this.getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(80);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.exit))
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击“确认”后的操作
System.exit(0);
}
})
.setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击“返回”后的操作,这里不设置没有任何操作
}
}).show();
}
return false;
}
@Override
public void onRestart() {
super.onRestart();
HttpConnection.getInstance().setHandler(mHandler);
}
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
String strBase = msg.getData().getString("Body");
String strRecv = msg.getData().getString("Body");
int statusCode = msg.getData().getInt("Status");
try {
if (strRecv != null)
strRecv = new String(strRecv.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
switch (msg.what) {
case Defines.ERROR:
new AlertDialog.Builder(MainActivity.this).setTitle(
getResources().getString(R.string.error) + "(Error code:" + String.valueOf(statusCode) + ")")
.setIcon(android.R.drawable.ic_dialog_info)
.setCancelable(false)
.setPositiveButton(getResources().getString(R.string.close), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击“确认”后的操作
System.exit(0);
}
}).show();
break;
default:
break;
}
super.handleMessage(msg);
}
};
}
说明
- NoSlidingViewPaper继承Viewpager屏蔽了ViewPager左右滑动,参见这里;
- OnNavigationItemSelectedListener对应导航栏点击事件,OnPageChangeListener对应ViewPager切换事件,为了同时兼容点击和滑动切换,相关操作放在OnPageChangeListener中,OnNavigationItemSelectedListener中只负责切换ViewPager,并触发OnPageChangeListener;
- setOffscreenPageLimit避免滑动显示的时候多次调用onCreate方法来进行刷新,参见这里;
- onRestart用来从其它Activity返回时,重新设置Handler;