android 网页拉起app可以打开京东app商品页吗

很抱歉! 您现在访问的页面未找到!21被浏览4886分享邀请回答01 条评论分享收藏感谢收起83 条评论分享收藏感谢收起3被浏览1354分享邀请回答1添加评论分享收藏感谢收起写回答1 个回答被折叠()Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现
电商内app,重点在于详情页商品展示,用户不仅要看到图,可以看到各种描述,以及相关规格参数。
有需要做电商类app的童鞋可以看看, 首先先看看效果实现
本项目使用的第三方框架:
加载网络图片使用的 Fresco
头部的商品图轮播 ConvenientBanner
导航栏切换 PagerSl...
电商内app,重点在于详情页商品展示,用户不仅要看到图,可以看到各种描述,以及相关规格参数。
有需要做电商类app的童鞋可以看看, 首先先看看效果实现
本项目使用的第三方框架:
加载网络图片使用的 Fresco
头部的商品图轮播 ConvenientBanner
导航栏切换 PagerSlidingTabStrip
先看看效果实现
由于代码量过多, 就不一一讲解只介绍几个核心的自定义控件)
不想看的童鞋可以下载apk或者在github上下载源码使用
github地址
最外层的布局文件
ItemWebView是SlideDetailsLayout的子View (SlideDetailsLayout代码太多, 放到了最后)
功能为显示商品简介的webview
防止往上滑动时会直接滑动到第一个View
实现滑动到WebView顶部时, 让父控件重新获得触摸事件
ItemListView 也是SlideDetailsLayout的子View
和ItemWebView功能大致一样
NoScrollViewPager为最外层的父布局
当滑动到图文详情模块时, 能禁止掉ViewPager的滑动事件
商品模块最外层的布局是一个自定义的ViewGroup名为SlideDetailsLayout
SlideDetailsLayout内容有两个View, mFrontView(第一个View)和mBehindView(第二个View)
有两种状态, 状态设置为close就显示第一个商品数据View, open状态就显示第二个图文详情View
这个商品详情页的架构也是本人在已上线的项目中使用
作者:coexist
来源:51CTO
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】2017互联网超级工程阿里双11完美落幕,交易额突破1682亿,但阿里工程师如何玩转“超级工程”,背后黑科技又是如何?12月13-14日,12位大咖直播分享揭秘1682亿背后技术实践,马上预约&&
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
针对日志类数据的一站式服务,用户无需开发就能快捷完成数据采集、消费、投递以及查询分析等功能,帮助提升运维、运营效...
操作审计(ActionTrail)会记录您的云账户资源操作,提供操作记录查询,并可以将记录文件保存到您指定的OS...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
社区之星年度评选,投票可抽奖
Loading...Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现 - 简书
Android仿京东、天猫app的商品详情页的布局架构, 以及功能实现
商品详情页
有需要做电商类app的童鞋可以看看, 首先先看看效果实现
Android Studio
使用的第三方框架:
加载网络图片使用的
头部的商品图轮播
导航栏切换
由于代码量过多, 就不一一讲解只介绍几个核心的自定义控件
不想看的童鞋可以下载apk或者在github上下载源码使用
最外层的布局文件
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"&
&!-- 顶部标题 --&
&LinearLayout
android:id="@+id/ll_title_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ec0f38"
android:orientation="vertical"&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:orientation="horizontal"&
&LinearLayout
android:id="@+id/ll_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="15dp"&
&ImageView
android:id="@+id/iv_back"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center_vertical"
android:src="@mipmap/address_come_back" /&
&/LinearLayout&
&LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"&
&!-- 商品、详情、评价切换的控件 --&
&com.gxz.PagerSlidingTabStrip
android:id="@+id/psts_tabs"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:layout_gravity="center"
android:textColor="#ffffff"
android:textSize="15sp"
app:pstsDividerColor="@android:color/transparent"
app:pstsDividerPaddingTopBottom="0dp"
app:pstsIndicatorColor="#ffffff"
app:pstsIndicatorHeight="2dp"
app:pstsScaleZoomMax="0.0"
app:pstsShouldExpand="false"
app:pstsSmoothScrollWhenClickTab="false"
app:pstsTabPaddingLeftRight="12dp"
app:pstsTextAllCaps="false"
app:pstsTextSelectedColor="#ffffff"
app:pstsUnderlineHeight="0dp" /&
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="图文详情"
android:textColor="#ffffff"
android:textSize="15sp"
android:visibility="gone" /&
&/LinearLayout&
&/LinearLayout&
&/LinearLayout&
&!-- 功能下面有介绍 --&
&com.hq.hsmwan.widget.NoScrollViewPager
android:id="@+id/vp_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" /&
&/LinearLayout&
ItemWebView是SlideDetailsLayout的子View (SlideDetailsLayout代码太多, 放到了最后)
功能为显示商品简介的Webview
防止往上滑动时会直接滑动到第一个View
实现滑动到WebView顶部时, 让父控件重新获得触摸事件
* 商品详情页底部的webview
public class ItemWebView extends WebView {
public float oldY;
private float oldX;
public ItemWebView(Context context) {
super(context);
public ItemWebView(Context context, AttributeSet attrs) {
super(context, attrs);
public ItemWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
float Y = ev.getY();
float Ys = Y - oldY;
float X = ev.getX();
//滑动到顶部让父控件重新获得触摸事件
if (Ys & 0 && t == 0) {
getParent().getParent().requestDisallowInterceptTouchEvent(false);
case MotionEvent.ACTION_DOWN:
getParent().getParent().requestDisallowInterceptTouchEvent(true);
oldY = ev.getY();
oldX = ev.getX();
case MotionEvent.ACTION_UP:
getParent().getParent().requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
ItemListView 也是SlideDetailsLayout的子View
跟 ItemWebView功能大致一样
当然这里不只是ListView可以, 其他的控件都可以写成这样来适配SlideDetailsLayout的滑动功能
* 商品详情页底部的ListView
public class ItemListView extends ListView implements AbsListView.OnScrollListener {
private float oldX, oldY;
private int currentP
public ItemListView(Context context) {
super(context);
setOnScrollListener(this);
public ItemListView(Context context, AttributeSet attrs) {
super(context, attrs);
setOnScrollListener(this);
public ItemListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOnScrollListener(this);
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
float Y = ev.getY();
float Ys = Y - oldY;
float X = ev.getX();
int [] location = new int [2];
getLocationInWindow(location);
//滑动到顶部让父控件重新获得触摸事件
if (Ys & 0 && currentPosition == 0) {
getParent().getParent().requestDisallowInterceptTouchEvent(false);
case MotionEvent.ACTION_DOWN:
getParent().getParent().requestDisallowInterceptTouchEvent(true);
oldY = ev.getY();
oldX = ev.getX();
case MotionEvent.ACTION_UP:
getParent().getParent().requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(ev);
public void onScrollStateChanged(AbsListView view, int scrollState) {
currentPosition = getFirstVisiblePosition();
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
&/br&&/br&&/br&
NoScrollViewPager为最外层的父布局
当滑动到图文详情模块时, 能禁止掉ViewPager的滑动事件
大概意思就是滑动跟到了图文详情时不能直接向右滑动的方式切换到详情和评价模块(参照京东淘宝功能)
* 提供禁止滑动功能的自定义ViewPager
public class NoScrollViewPager extends ViewPager {
private boolean noScroll =
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
public NoScrollViewPager(Context context) {
super(context);
public void setNoScroll(boolean noScroll) {
this.noScroll = noS
public void scrollTo(int x, int y) {
super.scrollTo(x, y);
public boolean onTouchEvent(MotionEvent arg0) {
if (noScroll)
return super.onTouchEvent(arg0);
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (noScroll)
return super.onInterceptTouchEvent(arg0);
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
public void setCurrentItem(int item) {
super.setCurrentItem(item);
商品模块最外层的布局是一个自定义的ViewGroup名为SlideDetailsLayout
SlideDetailsLayout内容有两个View,
mFrontView(第一个View)和mBehindView(第二个View)
有两种状态, 状态设置为close就显示第一个商品数据View, open状态就显示第二个图文详情View
@SuppressWarnings("unused")
public class SlideDetailsLayout extends ViewGroup {
* Callback for panel OPEN-CLOSE status changed.
public interface OnSlideDetailsListener {
* Called after status changed.
* @param status {@link Status}
void onStatucChanged(Status status);
public enum Status {
/** Panel is closed */
/** Panel is opened */
public static Status valueOf(int stats) {
if (0 == stats) {
return CLOSE;
} else if (1 == stats) {
return OPEN;
return CLOSE;
private static final float DEFAULT_PERCENT = 0.2f;
private static final int DEFAULT_DURATION = 300;
private View mFrontV
private View mBehindV
private float mTouchS
private float mInitMotionY;
private float mInitMotionX;
private View mT
private float mSlideO
private Status mStatus = Status.CLOSE;
private boolean isFirstShowBehindView =
private float mPercent = DEFAULT_PERCENT;
private long mDuration = DEFAULT_DURATION;
private int mDefaultPanel = 0;
private OnSlideDetailsListener mOnSlideDetailsL
public SlideDetailsLayout(Context context) {
this(context, null);
public SlideDetailsLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public SlideDetailsLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlideDetailsLayout, defStyleAttr, 0);
mPercent = a.getFloat(R.styleable.SlideDetailsLayout_percent, DEFAULT_PERCENT);
mDuration = a.getInt(R.styleable.SlideDetailsLayout_duration, DEFAULT_DURATION);
mDefaultPanel = a.getInt(R.styleable.SlideDetailsLayout_default_panel, 0);
a.recycle();
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
* Set the callback of panel OPEN-CLOSE status.
* @param listener {@link OnSlideDetailsListener}
public void setOnSlideDetailsListener(OnSlideDetailsListener listener) {
this.mOnSlideDetailsListener =
* Open pannel smoothly.
* @param smooth true, smoothly. false otherwise.
public void smoothOpen(boolean smooth) {
if (mStatus != Status.OPEN) {
mStatus = Status.OPEN;
final float height = -getMeasuredHeight();
animatorSwitch(0, height, true, smooth ? mDuration : 0);
* Close pannel smoothly.
* @param smooth true, smoothly. false otherwise.
public void smoothClose(boolean smooth) {
if (mStatus != Status.CLOSE) {
mStatus = Status.CLOSE;
final float height = -getMeasuredHeight();
animatorSwitch(height, 0, true, smooth ? mDuration : 0);
* Set the float value for indicate the moment of switch panel
* @param percent (0.0, 1.0)
public void setPercent(float percent) {
this.mPercent =
protected LayoutParams generateDefaultLayoutParams() {
return new MarginLayoutParams(MarginLayoutParams.WRAP_CONTENT, MarginLayoutParams.WRAP_CONTENT);
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(), attrs);
protected LayoutParams generateLayoutParams(LayoutParams p) {
return new MarginLayoutParams(p);
protected void onFinishInflate() {
super.onFinishInflate();
final int childCount = getChildCount();
if (1 &= childCount) {
throw new RuntimeException("SlideDetailsLayout only accept childs more than 1!!");
mFrontView = getChildAt(0);
mBehindView = getChildAt(1);
// set behindview's visibility to GONE before show.
//mBehindView.setVisibility(GONE);
if(mDefaultPanel == 1){
post(new Runnable() {
public void run() {
smoothOpen(false);
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int pWidth = MeasureSpec.getSize(widthMeasureSpec);
final int pHeight = MeasureSpec.getSize(heightMeasureSpec);
final int childWidthMeasureSpec =
MeasureSpec.makeMeasureSpec(pWidth, MeasureSpec.EXACTLY);
final int childHeightMeasureSpec =
MeasureSpec.makeMeasureSpec(pHeight, MeasureSpec.EXACTLY);
for (int i = 0; i & getChildCount(); i++) {
child = getChildAt(i);
// skip measure if gone
if (child.getVisibility() == GONE) {
measureChild(child, childWidthMeasureSpec, childHeightMeasureSpec);
setMeasuredDimension(pWidth, pHeight);
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int left =
final int right =
final int offset = (int) mSlideO
for (int i = 0; i & getChildCount(); i++) {
child = getChildAt(i);
// skip layout
if (child.getVisibility() == GONE) {
if (child == mBehindView) {
bottom = top + b -
bottom = b +
child.layout(left, top, right, bottom);
public boolean onInterceptTouchEvent(MotionEvent ev) {
ensureTarget();
if (null == mTarget) {
if (!isEnabled()) {
final int aciton = MotionEventCompat.getActionMasked(ev);
boolean shouldIntercept =
switch (aciton) {
case MotionEvent.ACTION_DOWN: {
mInitMotionX = ev.getX();
mInitMotionY = ev.getY();
shouldIntercept =
case MotionEvent.ACTION_MOVE: {
final float x = ev.getX();
final float y = ev.getY();
final float xDiff = x - mInitMotionX;
final float yDiff = y - mInitMotionY;
if (canChildScrollVertically((int) yDiff)) {
shouldIntercept =
final float xDiffabs = Math.abs(xDiff);
final float yDiffabs = Math.abs(yDiff);
// intercept rules:
// 1. The vertical displacement is larger than the hor
// 2. Panel stauts is CLOSE:slide up
// 3. Panel status is OPEN:slide down
if (yDiffabs & mTouchSlop && yDiffabs &= xDiffabs
&& !(mStatus == Status.CLOSE && yDiff & 0
|| mStatus == Status.OPEN && yDiff & 0)) {
shouldIntercept =
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
shouldIntercept =
return shouldI
public boolean onTouchEvent(MotionEvent ev) {
ensureTarget();
if (null == mTarget) {
if (!isEnabled()) {
boolean wantTouch =
final int action = MotionEventCompat.getActionMasked(ev);
switch (action) {
case MotionEvent.ACTION_DOWN: {
// if target is a view, we want the DOWN action.
if (mTarget instanceof View) {
wantTouch =
case MotionEvent.ACTION_MOVE: {
final float y = ev.getY();
final float yDiff = y - mInitMotionY;
if (canChildScrollVertically(((int) yDiff))) {
wantTouch =
processTouchEvent(yDiff);
wantTouch =
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
finishTouchEvent();
wantTouch =
return wantT
* @param offset Displacement in vertically.
private void processTouchEvent(final float offset) {
if (Math.abs(offset) & mTouchSlop) {
final float oldOffset = mSlideO
// pull up to open
if (mStatus == Status.CLOSE) {
// reset if pull down
if (offset &= 0) {
mSlideOffset = 0;
mSlideOffset =
if (mSlideOffset == oldOffset) {
// pull down to close
} else if (mStatus == Status.OPEN) {
final float pHeight = -getMeasuredHeight();
// reset if pull up
if (offset &= 0) {
mSlideOffset = pH
final float newOffset = pHeight +
mSlideOffset = newO
if (mSlideOffset == oldOffset) {
// relayout
requestLayout();
* Called after gesture is ending.
private void finishTouchEvent() {
final int pHeight = getMeasuredHeight();
final int percent = (int) (pHeight * mPercent);
final float offset = mSlideO
boolean changed =
if (Status.CLOSE == mStatus) {
if (offset &= -percent) {
mSlideOffset = -pH
mStatus = Status.OPEN;
// keep panel closed
mSlideOffset = 0;
} else if (Status.OPEN == mStatus) {
if ((offset + pHeight) &= percent) {
mSlideOffset = 0;
mStatus = Status.CLOSE;
// keep panel opened
mSlideOffset = -pH
animatorSwitch(offset, mSlideOffset, changed);
private void animatorSwitch(final float start, final float end) {
animatorSwitch(start, end, true, mDuration);
private void animatorSwitch(final float start, final float end, final long duration) {
animatorSwitch(start, end, true, duration);
private void animatorSwitch(final float start, final float end, final boolean changed) {
animatorSwitch(start, end, changed, mDuration);
private void animatorSwitch(final float start,
final float end,
final boolean changed,
final long duration) {
ValueAnimator animator = ValueAnimator.ofFloat(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
mSlideOffset = (float) animation.getAnimatedValue();
requestLayout();
animator.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
if (changed) {
if (mStatus == Status.OPEN) {
checkAndFirstOpenPanel();
if (null != mOnSlideDetailsListener) {
mOnSlideDetailsListener.onStatucChanged(mStatus);
animator.setDuration(duration);
animator.start();
* Whether the closed pannel is opened at first time.
* If open first, we should set the behind view's visibility as VISIBLE.
private void checkAndFirstOpenPanel() {
if (isFirstShowBehindView) {
isFirstShowBehindView =
mBehindView.setVisibility(VISIBLE);
* When pulling, target view changed by the panel status. If panel opened, the target is behind view.
* Front view is for otherwise.
private void ensureTarget() {
if (mStatus == Status.CLOSE) {
mTarget = mFrontV
mTarget = mBehindV
* Check child view can srcollable in vertical direction.
* @param direction Negative to check scrolling up, positive to check scrolling down.
* @return true if this view can be scrolled in the specified direction, false otherwise.
protected boolean canChildScrollVertically(int direction) {
if (mTarget instanceof AbsListView) {
return canListViewSroll((AbsListView) mTarget);
} else if (mTarget instanceof FrameLayout ||
mTarget instanceof RelativeLayout ||
mTarget instanceof LinearLayout) {
for (int i = 0; i & ((ViewGroup) mTarget).getChildCount(); i++) {
child = ((ViewGroup) mTarget).getChildAt(i);
if (child instanceof AbsListView) {
return canListViewSroll((AbsListView) child);
if (android.os.Build.VERSION.SDK_INT & 14) {
return ViewCompat.canScrollVertically(mTarget, -direction) || mTarget.getScrollY() & 0;
return ViewCompat.canScrollVertically(mTarget, -direction);
protected boolean canListViewSroll(AbsListView absListView) {
if (mStatus == Status.OPEN) {
return absListView.getChildCount() & 0
&& (absListView.getFirstVisiblePosition() & 0 || absListView.getChildAt(0)
.getTop() &
absListView.getPaddingTop());
final int count = absListView.getChildCount();
return count & 0
&& (absListView.getLastVisiblePosition() & count - 1
|| absListView.getChildAt(count - 1)
.getBottom() & absListView.getMeasuredHeight());
protected Parcelable onSaveInstanceState() {
SavedState ss = new SavedState(super.onSaveInstanceState());
ss.offset = mSlideO
ss.status = mStatus.ordinal();
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState)
super.onRestoreInstanceState(ss.getSuperState());
mSlideOffset = ss.
mStatus = Status.valueOf(ss.status);
if (mStatus == Status.OPEN) {
mBehindView.setVisibility(VISIBLE);
requestLayout();
static class SavedState extends BaseSavedState {
* Constructor used when reading from a parcel. Reads the state of the superclass.
* @param source
public SavedState(Parcel source) {
super(source);
offset = source.readFloat();
status = source.readInt();
* Constructor called by derived classes when creating their SavedState objects
* @param superState The state of the superclass of this view
public SavedState(Parcelable superState) {
super(superState);
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeFloat(offset);
out.writeInt(status);
public static final Creator&SavedState& CREATOR =
new Creator&SavedState&() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
public SavedState[] newArray(int size) {
return new SavedState[size];
这个商品详情页的架构也是本人在已上线的项目中使用
欢迎star、fork,
转载请注明出处
on the way
/hexianqiao3755
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新ViewPager图表(Chart)菜单(Menu)浮动菜单对话框空白页滑动删除手势操作RecyclerViewCardColorDrawableSpinner...
用到的组件1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好...
发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注
09:45字数 61697阅读 3316评论 2喜欢 85 用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FM...
又将迎来一年一度的七夕。朝思暮想的日子,终于来临因为,我们的牛郎哥哥,获得玉皇大帝的批准,又可以去约会他的织女妹妹了。可是,牛吃草去了;大气污染严重,连搭桥的喜鹊,都死光光了。 肿么办???肿么办??? 千载难逢的撩妹机会,牛郎哥哥才不愿意错过呀。 灵机一动:Oh 耶??...
等了好久终于等到了今天,《第三帝国的兴亡》终于拜读完毕。按年前的计划是沿着时间为主线一路写来,但中间隔着过年,再加上质疑阅读完毕后整理成文的意义不大,复述缺乏分析和趣味,没有可读性。于是放弃了当时的坚持,现在回头想想还是有些可惜。因为每天一文的坚持还是比较鸡血的。 希特...
这一秒踏上广州的这片土地,和浙江不一样的空气,不一样的语言,不一样的环境!我心中有种东西慢慢生长,我要在这混出一个名堂!告别以前的人,却还学不会放下!告别过去的自己,却还胆怯学校的新生活!你说好好过自己的新生活!好的 为了自己 为了家人 为了这口气!谁说女子不如男!
又开始纠结,到底是辞职还是不辞职 做个分析吧,十分钟自由书写 这份工作带给我的5个优点5个缺点 1:工资 一年10万 1 : 压力 与人沟通 2:时间的自由
2:时间的自由 3:接触的人群 很有素质 3:消耗 4:没有人管
4:一个人不知所措 5:在家办公
一、环境准备1、Linux2、JDK1.83、hadoop-2.7.3jdk和hadoop的安装都比较简单,这里不再赘述二、Hadoop配置hadoop安装完成后,配置文件在/etc/hadoop目录下,搭建伪分布式环境需要修改5个配置文件1、hadoop.env.shvi...}

我要回帖

更多关于 android app 嵌入网页 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信