package com.aiyou.bbs; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import com.aiyou.BaseActivity; import com.aiyou.R; import com.aiyou.bbs.adapter.FaceGridViewAdapter; import com.aiyou.bbs.adapter.PageListAdapter; import com.aiyou.bbs.adapter.ViewPagerAdapter; import com.aiyou.bbs.bean.Article; import com.aiyou.bbs.bean.Refer; import com.aiyou.bbs.bean.Threads; import com.aiyou.bbs.bean.User; import com.aiyou.bbs.faceviewlistener.MyGridViewListener; import com.aiyou.bbs.faceviewlistener.MyOnPageChangeListener; import com.aiyou.bbs.utils.BBSManager; import com.aiyou.utils.ActivityFunc; import com.aiyou.utils.AiYouManager; import com.aiyou.utils.JsonHelper; import com.aiyou.utils.NetWorkManager; import com.aiyou.utils.SwitchManager; import com.aiyou.utils.ViewContainer; import com.aiyou.utils.share.ShareTask; import com.aiyou.utils.thread.ThreadUtils; import com.aiyou.utils.time.TimeUtils; import com.aiyou.view.ControlScrollViewPager; import com.aiyou.view.CustomDialog; import com.aiyou.view.DarkImageView; import com.aiyou.view.GetScrollDistanceScrollView; import com.aiyou.view.GetScrollDistanceScrollView.OnScrollListener; import com.aiyou.view.ScrollTextView; import com.aiyou.viewLargeImage.ViewLargeImageActivity; import external.GifImageViewEx.net.frakbot.imageviewex.Converters; import external.GifImageViewEx.net.frakbot.imageviewex.ImageViewEx; import external.PullToRefresh.PullToRefreshBase; import external.PullToRefresh.PullToRefreshMyScrollView; import external.PullToRefresh.PullToRefreshBase.Mode; import external.PullToRefresh.PullToRefreshBase.OnRefreshListener2; import external.arcmenu.RayMenu; import external.otherview.CircleImageView; import external.otherview.SizeAdjustingTextView; import external.otherview.Win8ProgressBar; import external.smartimageview.SmartImageView; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.ClipboardManager; import android.text.TextUtils; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebSettings.PluginState; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ScrollView; import android.widget.SlidingDrawer; import android.widget.TextView; import android.widget.Toast; import android.widget.ImageView.ScaleType; /** * 查看文章内容 * * @author sollian */ @SuppressWarnings("deprecation") public class BBSContentActivity extends BaseActivity implements OnRefreshListener2<GetScrollDistanceScrollView>, OnItemClickListener, OnItemLongClickListener, OnTouchListener, OnScrollListener { public static final String KEY_ARTICLE = "article"; public static final String KEY_REFER = "refer"; private static final int REQUESTCODE_SECTION = 0x1113; private static final int MSG_CONTENT_ARTICLE = 0; private static final int MSG_OPERATION = 1; private static final int MSG_ARTICLE_SEND = 2; private static final int MSG_FORWARD_CROSS = 3; private static final int MSG_ERROR = -1; private static final String KEY_DATA = "data"; private SwitchManager mSwitchMgr; private AiYouManager mIUMgr; private BBSManager mBBSMgr; /** * 主题帖 */ private Threads mThreads = null; // 保存上一页内容 private List<Threads> mHistoryList = new ArrayList<>(); /** * 存放含有音频的webview */ private Set<WebView> mWebViewSet = new HashSet<>(); /** * 只看此ID存放的用户ID */ private String mThisID = null; /** * 是否显示Refer */ private boolean mIsRefer = false; /** * 动态表情相关 */ private int mVPLoc[] = new int[2]; private List<HashMap<String, String>> mDynamicFaceList = new ArrayList<>(); /** * 保存图片地址的list,用户展示大图时能够切换 */ private ArrayList<String> mImgUrlList = new ArrayList<>(); private int mImgId = 0; /** * 转载文章 */ private Article mForwardArticle = null; /** * 控件 */ // popmenu private FrameLayout mMenuFLayout; // title private LinearLayout mTitleLLayout; private ScrollTextView mTitleSTV; // 内容 private LinearLayout mListLLayout; private PullToRefreshMyScrollView mPTRScrollView; private GetScrollDistanceScrollView mScrollView; // 进度条 private FrameLayout mProgressFLayout; private Win8ProgressBar mProgressBar; // pagedrawer private SlidingDrawer mSlidingDrawer; private ImageView mHandleIV; private ListView mPageLV; private PageListAdapter mPageAdapter; private ArrayList<String> mPageList = new ArrayList<>(); // 回复 private LinearLayout mReplyLLayout; private LinearLayout mFaceLLayout; private ControlScrollViewPager mReplyVP; private EditText mReplyET; private ImageView mSendReplyIV; /* * 查看动态表情的view */ private LinearLayout mDynamicFaceLLayout; private ImageViewEx mDynamicFaceIVE; // help private ImageView mHelpIV; private boolean mIsReplyEnabled = true; private long mCurWrapTime; private ViewContainer mViewContainer; private Handler mHandler = new Handler(new Handler.Callback() { public boolean handleMessage(Message msg) { if (MSG_CONTENT_ARTICLE == msg.what) { // 将json数据解析为元数据 if (!mIsRefer) { mTitleSTV.setText(mThreads.title); } showContent(); } else if (MSG_OPERATION == msg.what) { // 删除文章 Toast.makeText(getBaseContext(), "删除成功", Toast.LENGTH_SHORT) .show(); startThread(mThreads.board_name, mThreads.group_id, mThisID, 1); } else if (MSG_ARTICLE_SEND == msg.what) { // 回复成功 Toast.makeText(getBaseContext(), "回复成功", Toast.LENGTH_SHORT) .show(); mReplyET.setText(""); } else if (MSG_FORWARD_CROSS == msg.what) { // 转载文章|转寄文章 Bundle data = msg.getData(); String info = data.getString(KEY_DATA); if (!TextUtils.isEmpty(info)) { Toast.makeText(getBaseContext(), info, Toast.LENGTH_SHORT) .show(); } return true; } else if (MSG_ERROR == msg.what) { Bundle data = msg.getData(); String strError = data.getString(KEY_DATA); if (TextUtils.isEmpty(strError)) { strError = NetWorkManager.MSG_NONET; } Toast.makeText(getBaseContext(), strError, Toast.LENGTH_SHORT) .show(); } showProgress(false); mPTRScrollView.onRefreshComplete(); mIsReplyEnabled = true; return true; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSwitchMgr = SwitchManager.getInstance(getBaseContext()); if (mSwitchMgr.isNightModeEnabled()) { // 夜间模式 setTheme(R.style.ThemeNight); } else { // 日间模式 setTheme(R.style.ThemeDay); } setContentView(R.layout.activity_bbs_content_article); init(); /** * 获取intent对象 */ Intent intent = getIntent(); mThreads = new Threads(); Article article = (Article) intent.getSerializableExtra(KEY_ARTICLE); if (null != article) { // 主题帖模式 mThreads.title = article.title; mThreads.board_name = article.board_name; mThreads.group_id = article.group_id; } else { // 提醒模式 Refer refer = (Refer) intent.getSerializableExtra(KEY_REFER); mThreads.title = refer.title; mThreads.board_name = refer.board_name; mThreads.group_id = refer.id; changeReferMode(true); } mTitleSTV.setText(mThreads.title); /** * 开启获取主题帖的线程 */ startThread(mThreads.board_name, mThreads.group_id, mThisID, 1); } /** * 排版显示内容的方法 */ @SuppressLint({ "NewApi", "InflateParams" }) private void showContent() { if (null == mThreads || null == mThreads.articles) { return; } // 滚动到顶部 mHandler.post(new Runnable() { @Override public void run() { mScrollView.fullScroll(ScrollView.FOCUS_UP); } }); // 更新页数列表 updatePageDrawer(); // 清除WebView的tag clearWebViewsTag(); int nChildCount = mListLLayout.getChildCount(); // 删除多余的布局 while (mThreads.articles.length < nChildCount) { mListLLayout.removeViewAt(0); nChildCount = mListLLayout.getChildCount(); } // 清空图片地址list mImgUrlList.clear(); mImgId = 0; mCurWrapTime = System.currentTimeMillis(); Article article; ViewHolder holder; View convertView; LayoutInflater inflater = LayoutInflater.from(this); for (int position = 0; position < mThreads.articles.length; position++) { article = mThreads.articles[position]; if (nChildCount > position) { convertView = mListLLayout.getChildAt(position); holder = (ViewHolder) convertView.getTag(); } else { convertView = inflater.inflate( R.layout.list_item_bbs_content_article, null); holder = new ViewHolder(); holder.ll_root = (LinearLayout) convertView .findViewById(R.id.list_item_bbcontent_article_ll_root); holder.civ_face = (CircleImageView) convertView .findViewById(R.id.list_item_bbcontent_article_civ_face); holder.tv_author = (TextView) convertView .findViewById(R.id.list_item_bbcontent_article_tv_author); holder.tv_date = (TextView) convertView .findViewById(R.id.list_item_bbcontent_article_tv_date); holder.tv_layor = (SizeAdjustingTextView) convertView .findViewById(R.id.list_item_bbscontent_article_tv_layor); holder.ll_content = (LinearLayout) convertView .findViewById(R.id.list_item_bbcontent_article_ll_content); holder.ll = (LinearLayout) convertView .findViewById(R.id.list_item_bbcontent_article_ll); holder.rm = (RayMenu) convertView .findViewById(R.id.list_item_bbcontent_article_rm); convertView.setTag(holder); mListLLayout.addView(convertView); } if (position == 0) { holder.ll_root.setPadding(0, mIUMgr.dip2px(50), 0, 0); } else { holder.ll_root.setPadding(0, 0, 0, 0); } if (mSwitchMgr.isNightModeEnabled()) { holder.ll .setBackgroundResource(R.drawable.background_list_night); holder.tv_author.setTextColor(Color.parseColor("#00aaaa")); } else { holder.ll.setBackgroundResource(R.drawable.background_list_day); holder.tv_author.setTextColor(Color.BLUE); } holder.ll_content.removeAllViews(); /** * 设置头像 */ if (mSwitchMgr.isFaceEnabled()) { if (null != article.user) { // 头像 if (null != article.user.face_url) { holder.civ_face.setImageUrl(article.user.face_url); } else { holder.civ_face .setImageResource(R.drawable.iu_default_green); } holder.civ_face.setTag(article.user); holder.civ_face.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { User user = (User) v.getTag(); ActivityFunc.startActivity(BBSContentActivity.this, BBSUserInfoActivity.class, user, false); } }); } } else { holder.civ_face.setVisibility(View.GONE); } /** * 设置用户ID */ if (article.user != null) { holder.tv_author.setText(article.user.id); } if (!mIsRefer) { if (article.user != null) { if (article.user.id.equals(mThreads.user.id)) { // 楼主名字显示为红色 holder.tv_author.setTextColor(Color.parseColor("#cc0000")); } } } /** * 时间 */ holder.tv_date.setText(TimeUtils.getLocalTime(article.post_time)); /** * 楼层 */ if (!mIsRefer) { int nLayor = (mThreads.pagination.page_current_count - 1) * 10 + position; if (0 == nLayor) { holder.tv_layor.setText("楼主"); holder.tv_layor.setTextColor(Color.parseColor("#cc0000")); } else if (1 == nLayor) { holder.tv_layor.setText("沙发"); holder.tv_layor.setTextColor(Color.parseColor("#ff6600")); } else if (2 == nLayor) { holder.tv_layor.setText("板凳"); holder.tv_layor.setTextColor(Color.parseColor("#cc00cc")); } else if (9 == nLayor) { holder.tv_layor.setText("酒楼"); holder.tv_layor.setTextColor(Color.parseColor("#008800")); } else { holder.tv_layor.setText(nLayor + "楼"); holder.tv_layor.setTextColor(Color.GRAY); } } /** * RayMenu */ // 重置 holder.rm.reset(); int[] rmItems; String strId = mBBSMgr.getUserId(); if (!mIsRefer) { // 阅读文章 if (BBSManager.GUEST.equals(strId)) { // guest rmItems = new int[1]; } else if (article.user.id.equals(strId)) { // 用户即是作者 rmItems = new int[5]; rmItems[1] = R.drawable.main_write; rmItems[2] = R.drawable.main_clear; rmItems[3] = R.drawable.main_cross; rmItems[4] = R.drawable.main_forward; } else { // 用户不是作者 rmItems = new int[4]; rmItems[1] = R.drawable.main_send; rmItems[2] = R.drawable.main_cross; rmItems[3] = R.drawable.main_forward; } if (null == mThisID) { // 只看此ID rmItems[0] = R.drawable.main_this_id; } else { // 查看全部 rmItems[0] = R.drawable.main_this_id_back; } } else { // 提醒模式 rmItems = new int[4]; rmItems[0] = R.drawable.main_source; rmItems[1] = R.drawable.main_send; rmItems[2] = R.drawable.main_cross; rmItems[3] = R.drawable.main_forward; } int length = rmItems.length; DarkImageView item; for (int i = 0; i < length; i++) { item = new DarkImageView(BBSContentActivity.this); item.setTag(article); item.setId(rmItems.length * 10 + i); if (Build.VERSION.SDK_INT >= 11) { item.setRotationY(180); } item.setImageResource(rmItems[i]); holder.rm.addItem(item, new RayMenuListener()); } /** * 显示内容 */ processContent(holder.ll_content, JsonHelper.toHtml(article, true), article); mListLLayout.invalidate(); } } /** * 显示内容 * * @param ll * @param html */ private void processContent(LinearLayout ll, String[] html, Article article) { String[] array = html[0].split("<image"); int length = array.length; String str; int index; String strImg; String strHtml; for (int i = 0; i < length; i++) { str = array[i].trim(); if (i != 0 && str.startsWith("=")) { index = str.indexOf(">"); if (index > 0) { strImg = str.substring(1, index); // 图片 processImage(ll, strImg); strHtml = str.substring(index + 1).trim(); if (!"".equals(strHtml)) { // 网页 processWebView(ll, strHtml, article); } } else { // 网页 processWebView(ll, str, article); } } else { // 网页 processWebView(ll, str, article); } } ll.invalidate(); } /** * 显示图片 * * @param ll * @param url */ private void processImage(LinearLayout ll, String url) { SmartImageView siv = mViewContainer.getSIV(mCurWrapTime); siv.setScaleType(ScaleType.CENTER_CROP); LayoutParams param = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); siv.setMaxWidth(mIUMgr.dip2px(200)); siv.setMaxHeight(mIUMgr.dip2px(300)); siv.setBackgroundColor(Color.WHITE); siv.setLayoutParams(param); siv.setAdjustViewBounds(true); siv.setImageUrl(url, R.drawable.iu_default_gray, R.drawable.iu_default_green); siv.setId(mImgId++); // 将图片地址添加到listImgSrc中 mImgUrlList.add(url); ll.addView(siv); // 单击图片查看大图 siv.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(BBSContentActivity.this, ViewLargeImageActivity.class); intent.putExtra(ViewLargeImageActivity.KEY_CUR_SEL, view.getId() + ""); intent.putExtra(ViewLargeImageActivity.KEY_URL_LIST, mImgUrlList); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); ActivityFunc.startActivity(BBSContentActivity.this, intent); } }); } /** * 显示webview * * @param ll * @param html */ @SuppressLint("SetJavaScriptEnabled") private void processWebView(LinearLayout ll, String html, Article article) { html = html.trim().replaceAll("\n", "<br/>"); html = "<body " // + // "style=\"text-align:justify;text-justify:distribute-all-lines;" + "\">" + html + "</body>"; if (mSwitchMgr.isNightModeEnabled()) { html = "<style type=\"text/css\">body{color:#888888}a:link{color:#00aaaa}</style>" + html; } else { html = "<style type=\"text/css\">body{color:#000000}</style>" + html; } WebView wv; wv = getWebView(); if (wv == null) { wv = new WebView(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); wv.setLayoutParams(params); mWebViewSet.add(wv); WebSettings setting = wv.getSettings(); setting.setJavaScriptEnabled(true); setting.setAllowFileAccess(true); setting.setAppCacheEnabled(true); setting.setLoadsImagesAutomatically(true); setting.setPluginState(PluginState.ON); // 设置缩放 wv.setInitialScale(mBBSMgr.getWebViewScaleSize()); // 设置背景色 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { wv.setBackgroundColor(0x01000000); } else { if (mSwitchMgr.isNightModeEnabled()) { wv.setBackgroundColor(Color.parseColor("#111111")); } else { wv.setBackgroundColor(Color.parseColor("#ffffff")); } } // 滚动条不显示 wv.setHorizontalScrollBarEnabled(false); wv.setVerticalScrollBarEnabled(false); } if (html.contains("<audio")) { wv.setTag(R.id.type, "audio"); } else { wv.setTag(R.id.type, "text"); } wv.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); wv.setTag(R.id.article, article); if (!BBSManager.GUEST.equals(mBBSMgr.getUserId())) { wv.setOnTouchListener(new OnTouchListener() { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { Article article = (Article) v.getTag(R.id.article); mReplyET.setHint("回复" + article.user.id); mSendReplyIV.setTag(article); if (mIsReplyEnabled) { if (View.VISIBLE == mReplyLLayout.getVisibility()) { // 隐藏回复窗口 showReply(false); } else { // 显示回复窗口 showReply(true); } } return false; } }); } ll.addView(wv); } private void clearWebViewsTag() { if (mWebViewSet == null || mWebViewSet.isEmpty()) { return; } for (WebView wv : mWebViewSet) { if (null != wv) { String tag = (String) wv.getTag(R.id.type); if (tag != null && !tag.equals("audio")) { // 设置缩放 // int size = (int) (wv.getScale() * 100); // if (size >= mBBSMgr.getWebViewScaleSize()) { // size = mBBSMgr.getWebViewScaleSize() - 1; // } else if (size < mBBSMgr.getWebViewScaleSize()) { // size = mBBSMgr.getWebViewScaleSize() + 1; // } // wv.setInitialScale(size); wv.setTag(R.id.type, null); wv.setTag(R.id.article, null); } } } } private WebView getWebView() { if (mWebViewSet == null || mWebViewSet.isEmpty()) { return null; } // for (WebView wv : mWebViewList) { // if (null != wv && wv.getTag(R.id.type) == null) { // return wv; // } // } return null; } @SuppressLint({ "NewApi", "InflateParams" }) private void init() { mViewContainer = new ViewContainer(this); mIUMgr = AiYouManager.getInstance(getBaseContext()); mBBSMgr = BBSManager.getInstance(getBaseContext()); /** * 背景图片 */ ImageView iv_background = (ImageView) findViewById(R.id.activity_bbscontent_article_iv_background); FrameLayout fl_container = (FrameLayout) findViewById(R.id.activity_bbscontent_article_fl_container); // 是否是简约模式 if (mSwitchMgr.isSimpleModeEnabled()) { iv_background.setVisibility(View.GONE); if (mSwitchMgr.isNightModeEnabled()) { fl_container.setBackgroundColor(getResources().getColor( R.color.bbs_background_night)); } else { fl_container.setBackgroundColor(getResources().getColor( R.color.bbs_background_day)); } } /** * popmenu */ mMenuFLayout = (FrameLayout) findViewById(R.id.activity_bbscontent_article_fl_menu); /** * title */ mTitleLLayout = (LinearLayout) findViewById(R.id.activity_bbscontent_article_ll_title); mTitleSTV = (ScrollTextView) findViewById(R.id.activity_bbscontent_article_stv_title); /** * PullToRefreshScrollView */ mPTRScrollView = (PullToRefreshMyScrollView) findViewById(R.id.activity_bbscontent_article_sv); mPTRScrollView.setScrollingWhileRefreshingEnabled(false);// 刷新时禁止滚动 mPTRScrollView.setOnRefreshListener(this); mScrollView = mPTRScrollView.getRefreshableView(); mScrollView.setOnScrollListener(this); /** * 设置 */ setHeaderFooter(); mListLLayout = (LinearLayout) findViewById(R.id.activity_bbscontent_article_ll_list); /** * 进度条 */ mProgressFLayout = (FrameLayout) findViewById(R.id.activity_bbscontent_article_fr_progress); mProgressBar = (Win8ProgressBar) findViewById(R.id.progress_bar); /** * help */ mHelpIV = (ImageView) findViewById(R.id.activity_bbscontent_article_iv_help); /** * 动态表情 */ mDynamicFaceLLayout = (LinearLayout) findViewById(R.id.activity_bbscontent_article_ll_ive); mDynamicFaceIVE = (ImageViewEx) findViewById(R.id.activity_bbscontent_article_ive); /** * pagedrawer */ mSlidingDrawer = (SlidingDrawer) findViewById(R.id.pagedrawer_sd); mHandleIV = (ImageView) findViewById(R.id.pagedrawer_iv_handle); mPageLV = (ListView) findViewById(R.id.pagedrawer_lv); mPageAdapter = new PageListAdapter(this, mPageList); mPageLV.setAdapter(mPageAdapter); mPageLV.setOnItemClickListener(this); mSlidingDrawer .setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() { @Override public void onDrawerOpened() { if (Build.VERSION.SDK_INT >= 11) { mHandleIV.setRotation(180); } } }); mSlidingDrawer .setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() { @Override public void onDrawerClosed() { if (Build.VERSION.SDK_INT >= 11) { mHandleIV.setRotation(0); } } }); /** * 回复 */ mReplyLLayout = (LinearLayout) findViewById(R.id.reply_ll_reply); mFaceLLayout = (LinearLayout) findViewById(R.id.reply_ll_face); mReplyVP = (ControlScrollViewPager) findViewById(R.id.reply_vp); ImageView mCursorIV = (ImageView) findViewById(R.id.reply_iv_cursor); TextView mClassicTV = (TextView) findViewById(R.id.reply_tv_classic); TextView mOnionTV = (TextView) findViewById(R.id.reply_tv_onion); TextView mTuzkiTV = (TextView) findViewById(R.id.reply_tv_tuzki); TextView mYociTV = (TextView) findViewById(R.id.reply_tv_yoci); ImageView mFaceIV = (ImageView) findViewById(R.id.reply_iv_face); mReplyET = (EditText) findViewById(R.id.reply_et_reply); mSendReplyIV = (ImageView) findViewById(R.id.reply_iv_reply); mFaceIV.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 打开|关闭表情栏 if (View.VISIBLE == mFaceLLayout.getVisibility()) { mFaceLLayout.setVisibility(View.GONE); } else { mFaceLLayout.setVisibility(View.VISIBLE); if (mSwitchMgr.needShowFaceHelp()) { mHelpIV.setVisibility(View.VISIBLE); mHelpIV.bringToFront(); mSwitchMgr.disableShowFaceHelp(); } } } }); mSendReplyIV.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sendReply(); } }); // 动画图片的宽度 int bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.face_cursor).getWidth();// 获取图片宽度 // 动画图片偏移量 int offset = ((AiYouManager.getScreenWidth() - mIUMgr.dip2px(20)) / 4 - bmpW) / 2;// 计算偏移量 Matrix matrix = new Matrix(); matrix.postTranslate(offset, 0); mCursorIV.setImageMatrix(matrix);// 设置动画初始位置 // 页卡 mClassicTV.setOnClickListener(new FaceTypeListener(0)); mOnionTV.setOnClickListener(new FaceTypeListener(1)); mTuzkiTV.setOnClickListener(new FaceTypeListener(2)); mYociTV.setOnClickListener(new FaceTypeListener(3)); // viewpager // tag页面列表 ArrayList<View> tabList = new ArrayList<>(); LayoutInflater mInflater = getLayoutInflater(); GridView gv_classic = (GridView) mInflater.inflate(R.layout.face_classic, null); GridView gv_onion = (GridView) mInflater.inflate(R.layout.face_onion, null); GridView gv_tuzki = (GridView) mInflater.inflate(R.layout.face_tuzki, null); GridView gv_yoci = (GridView) mInflater.inflate(R.layout.face_yoci, null); gv_classic.setAdapter(new FaceGridViewAdapter(getBaseContext(), 0)); gv_onion.setAdapter(new FaceGridViewAdapter(getBaseContext(), 1)); gv_tuzki.setAdapter(new FaceGridViewAdapter(getBaseContext(), 2)); gv_yoci.setAdapter(new FaceGridViewAdapter(getBaseContext(), 3)); gv_classic.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 0, mReplyET)); gv_onion.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 1, mReplyET)); gv_tuzki.setOnItemClickListener(new MyGridViewListener( getBaseContext(), 2, mReplyET)); gv_yoci.setOnItemClickListener(new MyGridViewListener(getBaseContext(), 3, mReplyET)); if (Build.VERSION.SDK_INT >= 11) { gv_classic.setOnItemLongClickListener(this); gv_onion.setOnItemLongClickListener(this); gv_tuzki.setOnItemLongClickListener(this); gv_yoci.setOnItemLongClickListener(this); gv_classic.setOnTouchListener(this); gv_onion.setOnTouchListener(this); gv_tuzki.setOnTouchListener(this); gv_yoci.setOnTouchListener(this); } tabList.add(gv_classic); tabList.add(gv_onion); tabList.add(gv_tuzki); tabList.add(gv_yoci); mReplyVP.setAdapter(new ViewPagerAdapter(tabList)); mReplyVP.setCurrentItem(0); mReplyVP.setOnPageChangeListener(new MyOnPageChangeListener(mCursorIV, offset, bmpW, 0)); } private class FaceTypeListener implements OnClickListener { private int index = 0; public FaceTypeListener(int index) { this.index = index; } @Override public void onClick(View v) { mReplyVP.setCurrentItem(index); } } /** * 获取主题帖的方法 * * @param board 版面名称 * @param id 主题ID * @param author 只看此author的帖子,null——查看全部 * @param page 页数 */ private void startThread(final String board, final int id, final String author, final int page) { /** * 设置进度条状态 */ showProgress(true); threadGetThreads(board, id, author, page); } /** * 删帖的方法 * * @param board 版面名称 * @param id 文章ID */ private void startOperationThread(final String board, final int id) { mHistoryList.clear(); showProgress(true); threadDeleteArticle(board, id); } /** * 分享 * * @param view */ public void onShare(View view) { String urlArticle = BBSManager.BBS_URL + "/#!article/" + mThreads.board_name + "/" + mThreads.group_id; ShareTask task = new ShareTask(BBSContentActivity.this, mThreads.title, urlArticle, new ShareTask.ShareListener() { @Override public void onShareStart() { showProgress(true); } @Override public void onShareFinish(Boolean success) { showProgress(false); } }); task.execute(); mMenuFLayout.setVisibility(View.GONE); } /** * 网址复制 * * @param view */ public void onCopy(View view) { // 将网址复制到剪贴板 ClipboardManager copy = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); copy.setText(BBSManager.BBS_URL + "/article/" + mThreads.board_name + "/" + mThreads.group_id); Toast.makeText(getBaseContext(), "复制成功", Toast.LENGTH_SHORT).show(); mMenuFLayout.setVisibility(View.GONE); } @Override protected void onDestroy() { super.onDestroy(); mListLLayout.removeAllViews(); mHistoryList.clear(); mHistoryList = null; clearWebView(); mThreads = null; mWebViewSet = null; mHandler.removeCallbacksAndMessages(null); mHandler = null; System.gc(); } @Override public void onPullDownToRefresh( PullToRefreshBase<GetScrollDistanceScrollView> refreshView) { if (null != mThreads.pagination) { if (-1 != mThreads.pagination.page_current_count) { for (Threads temp : mHistoryList) { if (null != temp.pagination) { if (-1 != temp.pagination.page_current_count && temp.pagination.page_current_count == mThreads.pagination.page_current_count - 1) { mThreads = temp; showContent(); mPTRScrollView.onRefreshComplete(); return; } } else { mHistoryList.remove(temp); } } int page = mThreads.pagination.page_current_count - 1; if (page > 0) { startThread(mThreads.board_name, mThreads.group_id, mThisID, page); } } } mPTRScrollView.onRefreshComplete(); } @Override public void onPullUpToRefresh( PullToRefreshBase<GetScrollDistanceScrollView> refreshView) { if (null != mThreads.pagination) { if (-1 != mThreads.pagination.page_current_count) { for (Threads temp : mHistoryList) { if (null != temp.pagination) { if (-1 != temp.pagination.page_current_count && temp.pagination.page_current_count == mThreads.pagination.page_current_count + 1) { mThreads = temp; showContent(); mPTRScrollView.onRefreshComplete(); return; } } else { mHistoryList.remove(temp); } } int page = mThreads.pagination.page_current_count + 1; if (page <= mThreads.pagination.page_all_count) { startThread(mThreads.board_name, mThreads.group_id, mThisID, page); } } } mPTRScrollView.onRefreshComplete(); } /** * 点击事件 * * @param view */ public void onClick(View view) { if (R.id.activity_bbscontent_article_iv_help == view.getId()) { mHelpIV.setVisibility(View.GONE); } else if (view == mMenuFLayout) { mMenuFLayout.setVisibility(View.GONE); } } /** * 是否显示回复窗口 * * @param flag */ private void showReply(boolean flag) { Animation anim; if (!flag) { anim = AnimationUtils.loadAnimation(this, R.anim.search_exit); mReplyLLayout.startAnimation(anim); mIsReplyEnabled = false; anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mReplyLLayout.setVisibility(View.GONE); mFaceLLayout.setVisibility(View.GONE); mIsReplyEnabled = true; mReplyLLayout.clearAnimation(); } @Override public void onAnimationRepeat(Animation animation) { } }); } else { anim = AnimationUtils.loadAnimation(this, R.anim.search_enter); mReplyLLayout.setVisibility(View.VISIBLE); mReplyLLayout.startAnimation(anim); mIsReplyEnabled = false; anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mIsReplyEnabled = true; mReplyLLayout.clearAnimation(); } @Override public void onAnimationRepeat(Animation animation) { } }); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUESTCODE_SECTION) { if (mForwardArticle != null) { String board = mForwardArticle.board_name; int id = mForwardArticle.id; // 分区列表返回的结果 String target = data .getStringExtra(BBSSectionActivity.KEY_NAME); // 开启转载文章线程 threadForwardCross(board, id, target, true); } } } } /** * pagedrawer点击选择页数 */ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { startThread(mThreads.board_name, mThreads.group_id, mThisID, position + 1); } /** * 更新pagedrawer */ @SuppressLint("NewApi") private void updatePageDrawer() { if (mIsRefer) { return; } mPageList.clear(); for (int i = 0; i < mThreads.pagination.page_all_count; i++) { if (i != mThreads.pagination.page_current_count - 1) { mPageList.add("false"); } else { mPageList.add("true"); } } mPageAdapter.notifyDataSetChanged(); int position = 0; int offset = mPageLV.getLastVisiblePosition() - mPageLV.getFirstVisiblePosition() + 1; offset = offset / 2 - 1; offset = offset < 0 ? 1 : offset; if (mThreads.pagination.page_current_count - offset >= 0) { position = mThreads.pagination.page_current_count - offset; } if (position == 0) { mPageLV.smoothScrollToPosition(position); } else { if (Build.VERSION.SDK_INT >= 11) { position -= mPageLV.getFirstVisiblePosition(); mPageLV.smoothScrollByOffset(position); } else { mPageLV.setSelection(position); } } } /** * 设置cpb_progress的状态和是否显示 * * @param flag */ private void showProgress(boolean flag) { if (flag) { mProgressFLayout.setVisibility(View.VISIBLE); mProgressBar.start(); } else { mProgressFLayout.setVisibility(View.GONE); mProgressBar.stop(); } } /** * 页面缩放按钮点击事件 * * @param view */ public void onZoomClick(View view) { int nId = view.getId(); int size = mBBSMgr.getWebViewScaleSize(); if (R.id.pagedrawer_iv_zoomin == nId) { // 缩小 if (size <= 100) { Toast.makeText(getBaseContext(), "已达到最小级别", Toast.LENGTH_SHORT) .show(); } else { mBBSMgr.setWebViewScaleSize(size - 25); } } else if (R.id.pagedrawer_iv_zoomout == nId) { // 放大 if (size >= 700) { Toast.makeText(getBaseContext(), "已达到最大级别", Toast.LENGTH_SHORT) .show(); } else { mBBSMgr.setWebViewScaleSize(size + 25); } } for (WebView wv : mWebViewSet) { if (null != wv) { wv.setInitialScale(mBBSMgr.getWebViewScaleSize()); } } } /** * 左上角返回按钮 */ public void selfFinish(View view) { scrollToFinishActivity(); } /** * 转载|转寄文章的线程 * * @param board 文章所在版面 * @param id 文章id * @param target 目标 * @param isCross 是否是转载 */ private void threadForwardCross(final String board, final int id, final String target, final boolean isCross) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } ThreadUtils.execute(new Runnable() { @Override public void run() { String strJson; if (isCross) { // 转载文章 strJson = Article.crossArticle(BBSContentActivity.this, board, id, target); } else { // 转寄文章 strJson = Article.forwardArticle(BBSContentActivity.this, board, id, target); } if (TextUtils.isEmpty(strJson)) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } // 转载文章|转寄文章 String strError = JsonHelper.checkError(strJson); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } String info; // 转载|转寄成功 if (isCross) { info = "转载成功"; } else { info = "转寄成功"; } if (null != mHandler) { Message msg = mHandler.obtainMessage(MSG_FORWARD_CROSS); Bundle data = msg.getData(); data.putString(KEY_DATA, info); mHandler.sendMessage(msg); } } }); } /** * 获取主题帖的线程 由 {@link #startThread(String, int, String, int)} 启动 * * @param board 版面名称 * @param id 主题ID * @param author 只看此author的帖子 * @param page 页数 */ private void threadGetThreads(final String board, final int id, final String author, final int page) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } ThreadUtils.execute(new Runnable() { @Override public void run() { String strJson; if (!mIsRefer) { if (-1 == page) { if (null == author) { strJson = Threads.getThreads( BBSContentActivity.this, board, id); } else { strJson = Threads.getThreads( BBSContentActivity.this, board, id, author); } } else { if (null == author) { strJson = Threads.getThreads( BBSContentActivity.this, board, id, page); } else { strJson = Threads.getThreads( BBSContentActivity.this, board, id, author, page); } } } else { strJson = Article.getArticle(BBSContentActivity.this, board, id); } if (TextUtils.isEmpty(strJson)) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } // 获取内容 // 检查返回的是否是错误信息 String strError = JsonHelper.checkError(strJson); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } // 将json数据解析为元数据 if (mIsRefer) { Article article = new Article(strJson); mThreads.articles = new Article[1]; mThreads.articles[0] = article; mThreads.group_id = article.group_id; } else { if (null != mThreads) { if (null != mThreads.pagination) { if (-1 != mThreads.pagination.page_current_count) { while (mHistoryList.size() > 15) { // listThreadsPre最大长度为15 mHistoryList.remove(0); } ArrayList<Threads> listTemp = new ArrayList<>(); for (Threads temp : mHistoryList) { if (null != temp.pagination) { if (-1 != temp.pagination.page_current_count) { if (mThreads.pagination.page_current_count == temp.pagination.page_current_count) { listTemp.add(temp); } } } } mHistoryList.removeAll(listTemp); if (mThreads.pagination.page_current_count != mThreads.pagination.page_all_count) { Threads newThreads = mThreads; mHistoryList.add(newThreads); } } } } mThreads = new Threads(strJson); } if (null != mHandler) { mHandler.sendEmptyMessage(MSG_CONTENT_ARTICLE); } } }); } /** * 删帖的线程 由 {@link #startOperationThread(String, int)} 启动 * * @param board 版面名称 * @param id 主题ID */ private void threadDeleteArticle(final String board, final int id) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } showProgress(true); ThreadUtils.execute(new Runnable() { @Override public void run() { String strJson = Article.deleteArticle(BBSContentActivity.this, board, id); if (TextUtils.isEmpty(strJson)) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } String strError = JsonHelper.checkError(strJson); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } if (null != mHandler) { mHandler.sendEmptyMessage(MSG_OPERATION); } } }); } /** * 回复线程 * * @param board * @param title * @param content * @param reid */ private void threadReplyArticle(final String board, final String title, final String content, final String reid) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } showProgress(true); ThreadUtils.execute(new Runnable() { @Override public void run() { String strJson = Article.sendArticle(BBSContentActivity.this, board, title, content, reid); if (TextUtils.isEmpty(strJson)) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } String strError = JsonHelper.checkError(strJson); if (null != strError) { // 是 错误信息 if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, strError); mHandler.sendMessage(msg); } return; } if (null != mHandler) { mHandler.sendEmptyMessage(MSG_ARTICLE_SEND); } } }); } /** * 下拉时,显示刷新还是上一页 * */ private void setHeaderFooter() { mPTRScrollView.setPullLabel("上一页", Mode.PULL_FROM_START); mPTRScrollView.setRefreshingLabel("正在加载...", Mode.PULL_FROM_START); mPTRScrollView.setReleaseLabel("松开加载", Mode.PULL_FROM_START); mPTRScrollView.setPullLabel("下一页", Mode.PULL_FROM_END); mPTRScrollView.setRefreshingLabel("正在加载...", Mode.PULL_FROM_END); mPTRScrollView.setReleaseLabel("松开加载", Mode.PULL_FROM_END); } /** * 清空webview */ @SuppressLint("NewApi") private void clearWebView() { if (0 != mWebViewSet.size()) { for (WebView wv : mWebViewSet) { if (null != wv) { if (Build.VERSION.SDK_INT >= 11) { wv.onPause(); } wv.removeAllViews(); wv.destroy(); } } } mWebViewSet.clear(); } class ViewHolder { public LinearLayout ll_root; public CircleImageView civ_face; public TextView tv_author; public TextView tv_date; public SizeAdjustingTextView tv_layor; public LinearLayout ll_content; public LinearLayout ll; public RayMenu rm; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 按下键盘上返回按钮 if (keyCode == KeyEvent.KEYCODE_BACK) { if (View.VISIBLE == mHelpIV.getVisibility()) { mHelpIV.setVisibility(View.GONE); return true; } else if (mSlidingDrawer.isOpened()) { mSlidingDrawer.close(); return true; } selfFinish(null); return true; } else if (keyCode == KeyEvent.KEYCODE_MENU) { showPopmenu(null); return true; } return super.onKeyDown(keyCode, event); } /** * 切换Article|Refer模式 * * @param isReferMode */ private void changeReferMode(boolean isReferMode) { mIsRefer = isReferMode; ImageView iv = (ImageView) findViewById(R.id.activity_bbscontent_article_iv_popmenu); if (isReferMode) { iv.setVisibility(View.INVISIBLE); mSlidingDrawer.setVisibility(View.GONE); mPTRScrollView.setMode(Mode.DISABLED); } else { iv.setVisibility(View.VISIBLE); mSlidingDrawer.setVisibility(View.VISIBLE); mPTRScrollView.setMode(Mode.BOTH); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // 禁用滑动结束Activity getSwipeBackLayout().setEnableGesture(false); // 震动 mIUMgr.vibrate(300); // 获取viewpager的屏幕坐标 mReplyVP.getLocationInWindow(mVPLoc); // 获取可见的gif图位置、名称 mDynamicFaceList.clear(); int start = parent.getFirstVisiblePosition(); int end = parent.getLastVisiblePosition(); View v; for (int i = 0; i <= end - start; i++) { HashMap<String, String> map = new HashMap<>(); v = parent.getChildAt(i); int location[] = new int[2]; if (null == v) { continue; } v.getLocationInWindow(location); if (v == view) { mDynamicFaceIVE.setId(i); } map.put("x", location[0] + ""); map.put("y", location[1] + ""); map.put("imgName", parent.getItemAtPosition(i + start).toString()); mDynamicFaceList.add(map); } // 锁定vp,使不能滚动 mReplyVP.setScrollable(false); // 获取图片名称 String imgName = parent.getItemAtPosition(position).toString(); mDynamicFaceIVE.setSource(Converters.assetToByteArray(getAssets(), "face/" + imgName)); // 获取控件在窗口中的绝对位置,不包括最顶部的状态栏 int location[] = new int[2]; view.getLocationInWindow(location); mDynamicFaceLLayout.setX(location[0] - mIUMgr.dip2px(10)); mDynamicFaceLLayout.setY(location[1] - mIUMgr.dip2px(120)); mDynamicFaceLLayout.setVisibility(View.VISIBLE); return true; } @SuppressLint("ClickableViewAccessibility") @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: if (mReplyVP.getScrollable()) { return false; } // 获取触摸点相对于屏幕的坐标,不包含顶部的通知栏 float eventX = mVPLoc[0] + event.getX(); float eventY = mVPLoc[1] + event.getY(); int x, y; HashMap<String, String> map; String imgName; for (int i = 0; i < mDynamicFaceList.size(); i++) { map = mDynamicFaceList.get(i); x = Integer.parseInt(map.get("x")); y = Integer.parseInt(map.get("y")); if (eventX >= x && eventX <= x + mIUMgr.dip2px(40) && eventY >= y && eventY <= y + mIUMgr.dip2px(40)) { if (i == mDynamicFaceIVE.getId()) { // 如果是正在播放的gif则返回 return false; } // 更新显示的gif imgName = map.get("imgName"); mDynamicFaceIVE.setSource(Converters.assetToByteArray( getAssets(), "face/" + imgName)); mDynamicFaceIVE.setId(i); mDynamicFaceLLayout.setX(x - mIUMgr.dip2px(10)); mDynamicFaceLLayout.setY(y - mIUMgr.dip2px(120)); break; } } break; case MotionEvent.ACTION_UP: // 重新初始化滑动结束Activity initSwipeOut(); mReplyVP.setScrollable(true); mDynamicFaceLLayout.setVisibility(View.GONE); break; } return false; } @Override public void onScroll(int y, int oldY) { if (y < mIUMgr.dip2px(70)) { mTitleLLayout.clearAnimation(); mTitleLLayout.setTag(null); if (View.VISIBLE != mTitleLLayout.getVisibility()) { showTitle(true); } } else { if (mTitleLLayout.getTag() == null) { if (y > oldY && View.VISIBLE == mTitleLLayout.getVisibility()) { showTitle(false); } else if (y < oldY && View.VISIBLE != mTitleLLayout.getVisibility()) { showTitle(true); } } } } /** * 是否显示标题栏 * * @param flag */ private void showTitle(final boolean flag) { Animation anim; mTitleLLayout.setTag("anim"); if (flag) { anim = AnimationUtils.loadAnimation(this, R.anim.slide_in_from_top); anim.setDuration(1000); mTitleLLayout.setVisibility(View.VISIBLE); mTitleLLayout.startAnimation(anim); } else { anim = AnimationUtils.loadAnimation(this, R.anim.slide_out_to_top); anim.setDuration(1000); mTitleLLayout.startAnimation(anim); } anim.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { if (!flag) { mTitleLLayout.setVisibility(View.GONE); } mTitleLLayout.setTag(null); } @Override public void onAnimationRepeat(Animation arg0) { } @Override public void onAnimationStart(Animation arg0) { } }); } public void showPopmenu(View view) { if (View.VISIBLE == mMenuFLayout.getVisibility()) { mMenuFLayout.setVisibility(View.GONE); } else { mMenuFLayout.setVisibility(View.VISIBLE); } } /** * 回复 */ private void sendReply() { // 发送 if (BBSManager.GUEST.equals(mBBSMgr.getUserId())) { Toast.makeText(getBaseContext(), "请先登录", Toast.LENGTH_SHORT).show(); return; } String message = mReplyET.getText().toString().trim(); if ("".equals(message)) { Toast.makeText(getBaseContext(), "回复内容为空", Toast.LENGTH_SHORT) .show(); return; } // 关闭输入法 AiYouManager.viewInputMethod(BBSContentActivity.this, false, mReplyET); // 关闭表情 mFaceLLayout.setVisibility(View.GONE); Article article = (Article) mSendReplyIV.getTag(); String reid = article.id + ""; String title = "Re:" + article.title; String strContent; if (article.id != article.group_id) { String[] arr = JsonHelper.toHtml(article, true); String strReply = arr[1]; // 去掉帖子中回复他人的部分 strContent = article.content.replace(strReply, "").trim(); // 去除多余的尾巴 while (strContent.endsWith("-") || strContent.endsWith("\n")) { strContent = strContent.substring(0, strContent.length() - 1); } if (strContent.length() > 500) { strContent = strContent.substring(0, 500); strContent += "\n..................."; } String[] array = strContent.split("\n"); strContent = ""; for (int i = 0; i < array.length; i++) { array[i] = AiYouManager.getTxtWithoutNTSRElement(array[i], ""); array[i] = array[i].trim(); if (!array[i].equals("")) { if (i < array.length - 1) { strContent += array[i] + "\n: "; } else { strContent += array[i]; } } } message = message + "\n【 在 " + article.user.id + " 的大作中提到: 】\n: " + strContent; } String tail = mBBSMgr.getAppTail(); if (null != tail) { message += "\n\n" + tail; } mReplyLLayout.setVisibility(View.GONE); mIsReplyEnabled = false; threadReplyArticle(article.board_name, title, message, reid); } private class RayMenuListener implements OnClickListener { @Override public void onClick(final View v) { int nId = v.getId(); if (nId == 10 || nId == 40 || nId == 50) { if (null == mThisID && !mIsRefer) { // 只看此ID Article article = (Article) v.getTag(); mThisID = article.user.id; Toast.makeText(getBaseContext(), "只看" + mThisID + "的帖子", Toast.LENGTH_SHORT).show(); mHistoryList.clear(); } else { // 查看全部 mThisID = null; Toast.makeText(getBaseContext(), "查看全部帖子", Toast.LENGTH_SHORT).show(); } mHistoryList.clear(); changeReferMode(false); startThread(mThreads.board_name, mThreads.group_id, mThisID, 1); } else if (nId == 41) { // 回复 Article article = (Article) v.getTag(); Intent intent = new Intent(BBSContentActivity.this, BBSWriteActivity.class); intent.putExtra(BBSWriteActivity.REPLY_ARTICLE, article); startActivity(intent); overridePendingTransition(android.R.anim.fade_in, 0); Toast.makeText(getBaseContext(), "回复该贴", Toast.LENGTH_SHORT) .show(); } else if (nId == 51) { // 编辑 Article article = (Article) v.getTag(); Intent intent = new Intent(BBSContentActivity.this, BBSWriteActivity.class); intent.putExtra(BBSWriteActivity.EDIT_ARTICLE, article); startActivity(intent); overridePendingTransition(android.R.anim.fade_in, 0); Toast.makeText(getBaseContext(), "编辑该贴", Toast.LENGTH_SHORT) .show(); } else if (nId == 52) { // 删帖 final CustomDialog dialog = new CustomDialog( BBSContentActivity.this); dialog.setMessage("确定删除该贴吗?"); dialog.setCancelButton(null).setOKButton(new OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); Article article = (Article) v.getTag(); startOperationThread(article.board_name, article.id); } }).show(); } else if (nId == 42 || nId == 53) { // 转载文章 Toast.makeText(getBaseContext(), "转载文章", Toast.LENGTH_SHORT) .show(); final CustomDialog dialog = new CustomDialog( BBSContentActivity.this); dialog.setMessage("确定转载该文章吗?"); dialog.setCancelButton(null).setOKButton(new OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); mForwardArticle = (Article) v.getTag(); // 转载文章 Toast.makeText(getBaseContext(), "请选择要转载的版面", Toast.LENGTH_SHORT).show(); // 打开分区列表 ActivityFunc.startActivityForResult( BBSContentActivity.this, BBSSectionActivity.class, null, REQUESTCODE_SECTION); } }).show(); } else if (nId == 43 || nId == 54) { // 转寄文章 Toast.makeText(getBaseContext(), "转寄文章", Toast.LENGTH_SHORT) .show(); final CustomDialog dialog = new CustomDialog( BBSContentActivity.this); dialog.setMessage("请输入收件人ID") .setCancelButton(null) .setOKGetEditTextContentListener( new CustomDialog.GetEditTextContentListener() { @Override public void onClick(View view, String userId) { // 转寄文章 if (TextUtils.isEmpty(userId)) { Toast.makeText(getBaseContext(), "请输入收件人ID", Toast.LENGTH_SHORT).show(); return; } dialog.dismiss(); Article article = (Article) v.getTag(); // 开启线程 threadForwardCross(article.board_name, article.id, userId, false); } }).show(); } } } }