Commit a7744e65 by Author name

Merge branch 'page-gaotong' into page-humingsen

# Conflicts:
#	app/src/main/AndroidManifest.xml
#	app/src/main/assets/fonts/iconfont.ttf
#	app/src/main/res/values/strings.xml
parents 70b224c6 9c6ef978
......@@ -18,6 +18,8 @@ android {
includeCompileClasspath true
}
}
multiDexEnabled true
}
buildTypes {
......@@ -49,6 +51,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
......@@ -69,5 +72,6 @@ dependencies {
implementation 'com.facebook.fresco:fresco:0.12.0'
implementation 'com.facebook.fresco:animated-webp:0.12.0'
implementation 'com.facebook.fresco:webpsupport:0.12.0'
implementation 'com.github.tiagohm.MarkdownView:library:0.19.0'
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.0'
}
......@@ -9,6 +9,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.page.PublishQuestionActivity">
<activity
android:theme="@style/AppTheme.FullScreen"
android:name=".SplashActivity">
......@@ -30,7 +31,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
......
package cn.yunliyunwai.beyondclouds.ui.page;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.yunliyunwai.beyondclouds.R;
/**
* A simple {@link Fragment} subclass.
* Use the {@link EmojiFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class EmojiFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public EmojiFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment EmojiFragment.
*/
// TODO: Rename and change types and number of parameters
public static EmojiFragment newInstance(String param1, String param2) {
EmojiFragment fragment = new EmojiFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_emoji, container, false);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.yunliyunwai.beyondclouds.R;
/**
* A simple {@link Fragment} subclass.
* Use the {@link FontFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class FontFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public FontFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment FontFragment.
*/
// TODO: Rename and change types and number of parameters
public static FontFragment newInstance(String param1, String param2) {
FontFragment fragment = new FontFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_font, container, false);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.bumptech.glide.request.target.ImageViewTarget;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.listener.ImageCompleteCallback;
import com.luck.picture.lib.tools.MediaUtils;
import com.luck.picture.lib.widget.longimage.ImageSource;
import com.luck.picture.lib.widget.longimage.ImageViewState;
import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView;
import cn.yunliyunwai.beyondclouds.R;
public class GlideEngine implements ImageEngine {
/**
* 加载图片
* @param context
* @param url
* @param imageView
*/
@Override
public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.load(url)
.into(imageView);
}
/**
* 加载网络图片适配长图方案
* @param context
* @param url
* @param imageView
* @param longImageView
* @param callback 网络图片加载回调监听
*/
@Override
public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, SubsamplingScaleImageView longImageView, ImageCompleteCallback callback) {
Glide.with(context)
.asBitmap()
.load(url)
.into(new ImageViewTarget<Bitmap>(imageView) {
@Override
public void onLoadStarted(@Nullable Drawable placeholder) {
super.onLoadStarted(placeholder);
if (callback != null) {
callback.onShowLoading();
}
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
if (callback != null) {
callback.onHideLoading();
}
}
@Override
protected void setResource(@Nullable Bitmap resource) {
if (callback != null) {
callback.onHideLoading();
}
if (resource != null) {
boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(), resource.getHeight());
longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
if (eqLongImage) {
//加载长图
longImageView.setQuickScaleEnabled(true);
longImageView.setZoomEnabled(true);
longImageView.setPanEnabled(true);
longImageView.setDoubleTapZoomDuration(100);
longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
longImageView.setImage(ImageSource.bitmap(resource),
new ImageViewState(0, new PointF(0, 0), 0));
} else {
//普通图片
imageView.setImageBitmap(resource);
}
}
}
});
}
@Override
public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, SubsamplingScaleImageView longImageView) {
}
/**
* 加载相册目录
* @param context
* @param url
* @param imageView
*/
@Override
public void loadFolderImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.asBitmap()
.load(url)
.override(180, 180)
.centerCrop()
.sizeMultiplier(0.5f)
.apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
.into(new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCornerRadius(8);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
}
/**
* 加载gif
* @param context
* @param url
* @param imageView
*/
@Override
public void loadAsGifImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.asGif()
.load(url)
.into(imageView);
}
/**
* 加载图片列表图片
* @param context
* @param url
* @param imageView
*/
@Override
public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.load(url)
.override(200, 200)
.centerCrop()
.apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
.into(imageView);
}
private GlideEngine() {
}
private static GlideEngine instance;
public static GlideEngine createGlideEngine() {
if (null == instance) {
synchronized (GlideEngine.class) {
if (null == instance) {
instance = new GlideEngine();
}
}
}
return instance;
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.databinding.ActivityLoginBinding;
public class LoginActivity extends AppCompatActivity {
private ActivityLoginBinding binding;
private Editable lastAccount;
private Editable lastMobile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityLoginBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
changeEditTextSize(binding.loginAccountEditText, binding.loginAccountBorder);
changeEditTextSize(binding.loginPasswordEditText, binding.loginPasswordBorder);
changeEditTextSize(binding.loginAuthCodeEditText, binding.loginAuthCodeBorder);
changeEditTextBorderStyle(binding.loginAccountEditText, binding.loginAccountBorder);
changeEditTextBorderStyle(binding.loginPasswordEditText, binding.loginPasswordBorder);
changeEditTextBorderStyle(binding.loginAuthCodeEditText, binding.loginAuthCodeBorder);
}
/**
* 改变用户输入前后EditText中字体的大小
* @param editText
* @param textView
*/
private void changeEditTextSize(EditText editText, TextView textView) {
editText.addTextChangedListener(new TextWatcher() {
boolean hint;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 0) {
hint = true;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
} else {
hint = false;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* 改变输入框获得焦点时边框的样式
* @param editText
* @param textView
*/
private void changeEditTextBorderStyle(EditText editText, TextView textView) {
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
textView.setBackgroundResource(R.drawable.background_edit_text_on_focus);
} else {
textView.setBackgroundResource(R.drawable.background_edit_text_lose_focus);
}
}
});
}
/**
* show_password_button点击事件,显示密码与隐藏密码
* @param view
*/
public void setPswVisible(View view) {
boolean isPwdVisible = !view.isSelected();
if (isPwdVisible) {
view.setSelected(true);
binding.loginShowPasswordButton.setText(R.string.icon_eye);
HideReturnsTransformationMethod method = HideReturnsTransformationMethod.getInstance();
binding.loginPasswordEditText.setTransformationMethod(method);
} else {
view.setSelected(false);
binding.loginShowPasswordButton.setText(R.string.icon_eye_slash);
PasswordTransformationMethod method = PasswordTransformationMethod.getInstance();
binding.loginPasswordEditText.setTransformationMethod(method);
}
binding.loginPasswordEditText.setSelection(binding.loginPasswordEditText.getText().toString().length());
}
/**
* 密码登录
* @param view
*/
@SuppressLint("WrongConstant")
public void passwordLogin(View view) {
binding.passwordLoginTitle.setTextColor(getResources().getColor(R.color.button_on_focus));
binding.messageLoginTitle.setTextColor(getResources().getColor(R.color.button_lose_focus));
if (binding.loginAccountBorderTitle.getText().toString().equals("手机号:")) {
lastMobile = binding.loginAccountEditText.getText();
}
binding.loginAccountBorderTitle.setText("账 号:");
binding.loginAccountEditText.setHint("请输入账号");
binding.loginAccountEditText.setText(lastAccount);
binding.loginAuthCodeBorder.setVisibility(8);
binding.loginAuthCodeBorderTitle.setVisibility(8);
binding.loginAuthCodeEditText.setVisibility(8);
binding.loginSendAuthCode.setVisibility(8);
binding.loginPasswordBorder.setVisibility(0);
binding.loginPasswordBorderTitle.setVisibility(0);
binding.loginPasswordEditText.setVisibility(0);
binding.loginShowPasswordButton.setVisibility(0);
binding.forgetPasswordButton.setVisibility(0);
binding.loginAccountEditText.clearFocus();
}
/**
* 短信验证码登录
* @param view
*/
@SuppressLint("WrongConstant")
public void messageLogin(View view) {
binding.passwordLoginTitle.setTextColor(getResources().getColor(R.color.button_lose_focus));
binding.messageLoginTitle.setTextColor(getResources().getColor(R.color.button_on_focus));
if (binding.loginAccountBorderTitle.getText().toString().equals("账 号:")) {
lastAccount = binding.loginAccountEditText.getText();
}
binding.loginAccountBorderTitle.setText("手机号:");
binding.loginAccountEditText.setHint("请输入手机号");
binding.loginAccountEditText.setText(lastMobile);
binding.loginPasswordBorder.setVisibility(8);
binding.loginPasswordBorderTitle.setVisibility(8);
binding.loginPasswordEditText.setVisibility(8);
binding.loginShowPasswordButton.setVisibility(8);
binding.forgetPasswordButton.setVisibility(8);
binding.loginAuthCodeBorder.setVisibility(0);
binding.loginAuthCodeBorderTitle.setVisibility(0);
binding.loginAuthCodeEditText.setVisibility(0);
binding.loginSendAuthCode.setVisibility(0);
binding.loginAccountEditText.clearFocus();
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.yunliyunwai.beyondclouds.R;
/**
* A simple {@link Fragment} subclass.
* Use the {@link MoreFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class MoreFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public MoreFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment MoreFragment.
*/
// TODO: Rename and change types and number of parameters
public static MoreFragment newInstance(String param1, String param2) {
MoreFragment fragment = new MoreFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_more, container, false);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import cn.yunliyunwai.beyondclouds.R;
public class MyTopicActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_topic);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.yunliyunwai.beyondclouds.R;
/**
* A simple {@link Fragment} subclass.
* Use the {@link OtherFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class OtherFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public OtherFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment OtherFragment.
*/
// TODO: Rename and change types and number of parameters
public static OtherFragment newInstance(String param1, String param2) {
OtherFragment fragment = new OtherFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_other, container, false);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.yunliyunwai.beyondclouds.R;
/**
* A simple {@link Fragment} subclass.
* Use the {@link PictureFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class PictureFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public PictureFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment PictureFragment.
*/
// TODO: Rename and change types and number of parameters
public static PictureFragment newInstance(String param1, String param2) {
PictureFragment fragment = new PictureFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_picture, container, false);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import cn.yunliyunwai.beyondclouds.R;
public class PostWritingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post_writing);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.fonts.Font;
import android.os.Build;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.android.material.tabs.TabLayout;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import java.util.ArrayList;
import java.util.List;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.databinding.ActivityPublishQuestionBinding;
import cn.yunliyunwai.beyondclouds.ui.page.markdown.MarkdownButtonEnum;
public class PublishQuestionActivity extends AppCompatActivity {
private ActivityPublishQuestionBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityPublishQuestionBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
//创建fragment的集合
List<Fragment> list = new ArrayList<>();
list.add(new PictureFragment());
list.add(new EmojiFragment());
list.add(new FontFragment());
list.add(new OtherFragment());
list.add(new MoreFragment());
//所有头部图片的集合
List<Integer> tabImages = new ArrayList<>();
tabImages.add(R.drawable.photo_choose);
tabImages.add(R.drawable.emj_choose);
tabImages.add(R.drawable.font_choose);
tabImages.add(R.drawable.other_choose);
tabImages.add(R.drawable.more_choose);
binding.questionToolBar.setAdapter(new PublishQuestionViewPagerAdapter(getSupportFragmentManager(), this, list, tabImages));
binding.questionTabLayout.setupWithViewPager(binding.questionToolBar);
binding.questionToolBar.setCurrentItem(0);
binding.questionTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onTabSelected(TabLayout.Tab tab) {
tab.setText(getImageSpanSelected(tabImages.get(tab.getPosition())));
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tab.setText(getImageSpanUnSelected(tabImages.get(tab.getPosition())));
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private CharSequence getImageSpanSelected(int imageId) {
Drawable dImage = getResources().getDrawable(imageId);
dImage.setBounds(0, 0, dImage.getIntrinsicWidth()/2, dImage.getIntrinsicHeight()/2);
dImage.setTint(Color.parseColor("#00aae6"));
SpannableString sp = new SpannableString(" ");
ImageSpan imageSpan = new ImageSpan(dImage, ImageSpan.ALIGN_BOTTOM);
sp.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private CharSequence getImageSpanUnSelected(int imageId) {
Drawable dImage = getResources().getDrawable(imageId);
dImage.setBounds(0, 0, dImage.getIntrinsicWidth()/2, dImage.getIntrinsicHeight()/2);
dImage.setTint(Color.parseColor("#999999"));
SpannableString sp = new SpannableString(" ");
ImageSpan imageSpan = new ImageSpan(dImage, ImageSpan.ALIGN_BOTTOM);
sp.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
public void onClick(View view) {
String tag = (String) view.getTag();
switch (MarkdownButtonEnum.valueOf(tag)) {
case FONT_BOLD :
addMarkdownGrammar("****");
break;
case FONT_ITALIC:
addMarkdownGrammar("**");
break;
case FONT_UNDERLINE:
addMarkdownGrammar("++++");
break;
case FONT_SUPERSCRIPT:
addMarkdownGrammar("^^");
break;
case FONT_SUBSCRIPT:
addMarkdownGrammar("~~");
break;
case FONT_STRIKE_THROUGH:
addMarkdownGrammar("~~~~");
break;
case H1:
addMarkdownGrammar("# ");
break;
case H2:
addMarkdownGrammar("## ");
break;
case H3:
addMarkdownGrammar("### ");
break;
case H4:
addMarkdownGrammar("#### ");
break;
case H5:
addMarkdownGrammar("##### ");
break;
case H6:
addMarkdownGrammar("###### ");
break;
case UNORDERED_LIST:
addMarkdownGrammar("+ ");
break;
case CODE_BLOCK:
addMarkdownGrammar("```\n\n```");
break;
case CROSS_LINE:
addMarkdownGrammar("\n***\n");
break;
case TABLE:
addMarkdownGrammar(createTable());
break;
case ORDERED_LIST:
addMarkdownGrammar("\n1. \n2. \n3.");
default:
Log.d("msg", tag);
}
}
private void addMarkdownGrammar(String grammar) {
String rawData = binding.editTextQuestionContent.getText().toString();
StringBuilder data = new StringBuilder(rawData);
//将Markdown语法加入到data中并显示在页面上
data.append(grammar);
binding.editTextQuestionContent.setText(data.toString());
//使页面指针停于data末尾
binding.editTextQuestionContent.setSelection(binding.editTextQuestionContent.getText().toString().length());
}
//字符串拼接形成表格
private String createTable () {
//表格的列数
int line;
//表格的行数
int row;
EditText lineEditText = findViewById(R.id.edit_text_form_line);
if (lineEditText.getText().toString().equals("")) {
line = 3;
} else {
line = Integer.parseInt(lineEditText.getText().toString());
}
EditText rowEditText = findViewById(R.id.edit_text_form_row);
if (rowEditText.getText().toString().equals("")) {
row = 3;
} else {
row = Integer.parseInt(lineEditText.getText().toString());
}
//通过循环制表
StringBuilder table = new StringBuilder("\n"+"|");
for (int i = 0 ; i < row ; i++) {
for (int j = 0 ; j < line ; j++) {
if (i == 0) {
table.append("title|");
} else if (i == 1) {
table.append("-|");
} else {
table.append("content|");
}
}
if (i < row-1) {
table.append("\n"+"|");
}
}
return table.toString();
}
public void addCover(View view) {
PictureSelector. create(this)
.openGallery(PictureMimeType.ofImage())
.loadImageEngine(GlideEngine.createGlideEngine())
.forResult(PictureConfig.CHOOSE_REQUEST);
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.ArrayList;
import java.util.List;
import cn.yunliyunwai.beyondclouds.data.model.CommonCategory;
public class PublishQuestionViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mList;
private List<Integer> tabImg;
private Context context;
public PublishQuestionViewPagerAdapter(@NonNull FragmentManager fm, Context context, List<Fragment> list, List<Integer> tabImg) {
super(fm);
this.context = context;
this.mList = list;
this.tabImg = tabImg;
}
@NonNull
@Override
public Fragment getItem(int position) {
return mList.get(position);
}
@Override
public int getCount() {
return mList.size();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Nullable
@Override
public CharSequence getPageTitle(int position) {
if (0 == position) {
return getImageSpanSelected(tabImg.get(position));
} else {
return getImageSpanUnSelected(tabImg.get(position));
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private CharSequence getImageSpanSelected(int imageId) {
Drawable dImage = context.getResources().getDrawable(imageId);
dImage.setBounds(0, 0, dImage.getIntrinsicWidth()/2, dImage.getIntrinsicHeight()/2);
dImage.setTint(Color.parseColor("#00aae6"));
SpannableString sp = new SpannableString(" ");
ImageSpan imageSpan = new ImageSpan(dImage, ImageSpan.ALIGN_BOTTOM);
sp.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private CharSequence getImageSpanUnSelected(int imageId) {
Drawable dImage = context.getResources().getDrawable(imageId);
dImage.setBounds(0, 0, dImage.getIntrinsicWidth()/2, dImage.getIntrinsicHeight()/2);
dImage.setTint(Color.parseColor("#999999"));
SpannableString sp = new SpannableString(" ");
ImageSpan imageSpan = new ImageSpan(dImage, ImageSpan.ALIGN_BOTTOM);
sp.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.TypedValue;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.databinding.ActivityRegisterBinding;
public class RegisterActivity extends AppCompatActivity {
private ActivityRegisterBinding binding;
private Editable lastMobile;
private Editable lastEmail;
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityRegisterBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
changeEditTextSize(binding.registerAccountEditText, binding.registerAccountBorder);
changeEditTextSize(binding.registerAuthCodeEditText, binding.registerAuthCodeBorder);
changeEditTextSize(binding.registerPasswordEditText, binding.registerPasswordBorder);
changeEditTextBorderStyle(binding.registerAccountEditText, binding.registerAccountBorder);
changeEditTextBorderStyle(binding.registerAuthCodeEditText, binding.registerAuthCodeBorder);
changeEditTextBorderStyle(binding.registerPasswordEditText, binding.registerPasswordBorder);
}
/**
* 改变用户输入前后EditText中字体的大小
* @param editText
* @param textView
*/
private void changeEditTextSize(EditText editText, TextView textView) {
editText.addTextChangedListener(new TextWatcher() {
boolean hint;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 0) {
hint = true;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
} else {
hint = false;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* 改变输入框获得焦点时边框的样式
* @param editText
* @param textView
*/
private void changeEditTextBorderStyle(EditText editText, TextView textView) {
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
textView.setBackgroundResource(R.drawable.background_edit_text_on_focus);
} else {
textView.setBackgroundResource(R.drawable.background_edit_text_lose_focus);
}
}
});
}
/**
* show_password_button点击事件,显示密码与隐藏密码
* @param view
*/
public void setPswVisible(View view) {
boolean isPwdVisible = !view.isSelected();
if (isPwdVisible) {
view.setSelected(true);
binding.registerShowPasswordButton.setText(R.string.icon_eye);
HideReturnsTransformationMethod method = HideReturnsTransformationMethod.getInstance();
binding.registerPasswordEditText.setTransformationMethod(method);
} else {
view.setSelected(false);
binding.registerShowPasswordButton.setText(R.string.icon_eye_slash);
PasswordTransformationMethod method = PasswordTransformationMethod.getInstance();
binding.registerPasswordEditText.setTransformationMethod(method);
}
binding.registerPasswordEditText.setSelection(binding.registerPasswordEditText.getText().toString().length());
}
/**
* 手机号注册
* @param view
*/
@SuppressLint("WrongConstant")
public void mobileRegister(View view) {
binding.mobileRegisterTitle.setTextColor(getResources().getColor(R.color.button_on_focus));
binding.emailRegisterTitle.setTextColor(getResources().getColor(R.color.button_lose_focus));
if (binding.registerAccountBorderTitle.getText().toString().equals("邮 箱:")) {
lastEmail = binding.registerAccountEditText.getText();
}
binding.registerAccountBorderTitle.setText("手机号:");
binding.registerAccountEditText.setHint("请输入手机号");
binding.registerAccountEditText.setText(lastMobile);
binding.registerPasswordBorder.setVisibility(8);
binding.registerPasswordBorderTitle.setVisibility(8);
binding.registerPasswordEditText.setVisibility(8);
binding.registerShowPasswordButton.setVisibility(8);
binding.registerAuthCodeBorder.setVisibility(0);
binding.registerAuthCodeBorderTitle.setVisibility(0);
binding.registerAuthCodeEditText.setVisibility(0);
binding.registerSendAuthCode.setVisibility(0);
binding.registerAccountEditText.clearFocus();
}
/**
* 邮箱号注册
* @param view
*/
@SuppressLint("WrongConstant")
public void emailRegister(View view) {
binding.mobileRegisterTitle.setTextColor(getResources().getColor(R.color.button_lose_focus));
binding.emailRegisterTitle.setTextColor(getResources().getColor(R.color.button_on_focus));
if (binding.registerAccountBorderTitle.getText().toString().equals("手机号:")) {
lastMobile = binding.registerAccountEditText.getText();
}
binding.registerAccountBorderTitle.setText("邮 箱:");
binding.registerAccountEditText.setHint("请输入邮箱");
binding.registerAccountEditText.setText(lastEmail);
binding.registerPasswordBorder.setVisibility(0);
binding.registerPasswordBorderTitle.setVisibility(0);
binding.registerPasswordEditText.setVisibility(0);
binding.registerShowPasswordButton.setVisibility(0);
binding.registerAuthCodeBorder.setVisibility(8);
binding.registerAuthCodeBorderTitle.setVisibility(8);
binding.registerAuthCodeEditText.setVisibility(8);
binding.registerSendAuthCode.setVisibility(8);
binding.registerAccountEditText.clearFocus();
}
}
package cn.yunliyunwai.beyondclouds.ui.page;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import cn.yunliyunwai.beyondclouds.R;
public class RegisterSuccess extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_success);
}
}
package cn.yunliyunwai.beyondclouds.ui.page.markdown;
public enum MarkdownButtonEnum {
/**
* 粗体
*/
FONT_BOLD,
/**
* 斜体
*/
FONT_ITALIC,
/**
* 下划线
*/
FONT_UNDERLINE,
/**
* 上角标
*/
FONT_SUPERSCRIPT,
/**
* 下角标
*/
FONT_SUBSCRIPT,
/**
* 中划线
*/
FONT_STRIKE_THROUGH,
/**
* h1
*/
H1,
/**
* h2
*/
H2,
/**
* h3
*/
H3,
/**
* h4
*/
H4,
/**
* h5
*/
H5,
/**
* h6
*/
H6,
/**
* 有序列表
*/
ORDERED_LIST,
/**
* 无序列表
*/
UNORDERED_LIST,
/**
* 代码块
*/
CODE_BLOCK,
/**
* 分割线
*/
CROSS_LINE,
/**
* 表格
*/
TABLE
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#f4f8fa" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<corners android:radius="2dp" />
<stroke android:width="1dp" android:color="#bec7cb" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#f4f8fa" />
<corners android:radius="4dp" />
<stroke android:width="1dp" android:color="#4d00aae6" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false">
<shape>
<solid android:color="#00aae6" />
<corners android:radius="4dp" />
</shape>
</item>
<item android:state_pressed="true">
<shape>
<solid android:color="#779ff8" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false">
<shape>
<solid android:color="#75d098" />
<corners android:radius="4dp" />
</shape>
</item>
<item android:state_pressed="true">
<shape>
<solid android:color="#00BB00" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#ffffff" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.page.MyTopicActivity">
<ImageView
android:id="@+id/topic_photo"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="22dp"
android:src="@drawable/topic_photo"
app:layout_constraintStart_toStartOf="@+id/guidelineLeft"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/topic_name"
android:layout_width="0dp"
android:layout_height="24dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="22dp"
android:gravity="left"
android:textColor="@color/colorTextAccent"
android:textSize="18sp"
android:text="@string/topic_name"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/topic_photo"/>
<TextView
android:id="@+id/topic_data"
android:layout_width="0dp"
android:layout_height="14dp"
android:gravity="left"
android:textSize="10sp"
android:textColor="@color/colorText"
android:text="@string/topic_data"
android:layout_marginTop="8dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintTop_toBottomOf="@+id/topic_name"
app:layout_constraintStart_toEndOf="@+id/topic_photo"/>
<Button
android:id="@+id/topic_edit"
android:layout_width="25dp"
android:layout_height="15dp"
android:gravity="right"
android:textSize="12sp"
android:textColor="@color/colorText"
android:layout_marginTop="40dp"
android:background="@null"
android:text="@string/topic_edit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="@+id/guidelineRight"/>
<TextView
android:layout_width="64dp"
android:layout_height="14dp"
android:gravity="center"
android:textSize="10sp"
android:textColor="@color/colorText"
android:layout_marginBottom="14dp"
android:text="— 到底了 —"
app:layout_constraintStart_toStartOf="@+id/guidelineLeft"
app:layout_constraintEnd_toEndOf="@+id/guidelineRight"
app:layout_constraintBottom_toBottomOf="parent"/>
<View
android:id="@+id/dividerOne"
android:layout_width="0dp"
android:layout_height="0.8dp"
android:layout_marginTop="92dp"
android:background="@color/dividerColor"
app:layout_goneMarginTop="92dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/guidelineLeft"
app:layout_constraintEnd_toStartOf="@+id/guidelineRight"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="12dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="12dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWhite"
tools:context=".ui.page.PostWritingActivity">
<EditText
android:id="@+id/edit_post"
android:layout_width="match_parent"
android:layout_height="271dp"
android:hint="@string/post_hint"
android:gravity="left|top"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="13dp"
android:paddingBottom="13dp"
android:textSize="14sp"
android:background="@color/colorWhite"
android:scrollbars="vertical"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/post_choice"
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@color/colorBackgroundPostWritingChoice"
app:layout_constraintTop_toBottomOf="@+id/edit_post">
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/btn_photo_choose"
android:layout_width="20dp"
android:layout_height="22dp"
android:layout_marginTop="11dp"
android:layout_marginStart="36dp"
android:layout_marginLeft="36dp"
android:textSize="16sp"
android:text="@string/icon_photo_choose"
android:textColor="@color/colorText"
app:layout_constraintStart_toStartOf="@+id/post_choice"
app:layout_constraintTop_toTopOf="@+id/post_choice" />
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/btn_code"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_marginTop="13dp"
android:text="@string/icon_code"
android:textColor="@color/colorText"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_photo_choose"
app:layout_constraintEnd_toStartOf="@+id/btn_link"/>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/btn_link"
android:layout_width="20dp"
android:layout_height="22dp"
android:layout_marginTop="11dp"
android:textSize="20sp"
android:text="@string/icon_link"
android:textColor="@color/colorText"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/btn_emj"
android:layout_width="20dp"
android:layout_height="22dp"
android:layout_marginTop="11dp"
android:textSize="20sp"
android:textColor="@color/colorText"
android:text="@string/icon_emj_choose"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_link"
app:layout_constraintEnd_toStartOf="@+id/btn_topic"/>
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/btn_topic"
android:layout_width="20dp"
android:layout_height="22dp"
android:layout_marginEnd="34dp"
android:layout_marginRight="34dp"
android:textSize="20sp"
android:layout_marginTop="11dp"
android:textColor="@color/colorText"
android:text="@string/icon_topic_choose"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.page.PublishQuestionActivity">
<EditText
android:id="@+id/edit_text_question_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="请用一句话概括问题并以问号结尾"
android:textSize="20sp"
android:textColor="#666666"
android:singleLine="true"
android:background="@null"
android:layout_marginTop="64dp"
app:layout_constraintStart_toStartOf="@id/publish_question_left_guide_line"
app:layout_constraintEnd_toEndOf="@id/publish_question_right_guide_line"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/barrier_question_title_bottom"
android:layout_width="0dp"
android:layout_height="1dp"
android:background="#3400aae6"
android:layout_marginTop="14dp"
app:layout_constraintStart_toStartOf="@id/publish_question_left_guide_line"
app:layout_constraintEnd_toEndOf="@id/publish_question_right_guide_line"
app:layout_constraintTop_toBottomOf="@id/edit_text_question_title" />
<EditText
android:id="@+id/edit_text_question_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="问题详情"
android:textSize="15sp"
android:textColor="#999999"
android:paddingTop="17dp"
android:background="@null"
android:lines="9"
android:gravity="top"
app:layout_constraintStart_toStartOf="@id/publish_question_left_guide_line"
app:layout_constraintEnd_toEndOf="@id/publish_question_right_guide_line"
app:layout_constraintTop_toBottomOf="@id/barrier_question_title_bottom"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/question_tool_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#efefef"
app:layout_constraintTop_toBottomOf="@id/edit_text_question_content"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/question_tab_layout"
android:background="#f5f8fa"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.viewpager.widget.ViewPager>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/publish_question_left_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="12dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/publish_question_right_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="12dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.page.RegisterSuccess">
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:id="@+id/register_success_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/icon_success"
android:textSize="40dp"
android:textColor="#75d098"
android:layout_marginTop="143dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/register_success_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册成功"
android:textSize="13sp"
android:textColor="#75d098"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/register_success_icon" />
<TextView
android:id="@+id/register_success_verify_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请查看邮箱收件箱验证账号"
android:textSize="14sp"
android:textColor="#333333"
android:layout_marginTop="33dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/register_success_text" />
<Button
android:id="@+id/register_success_verify_button"
android:layout_width="292dp"
android:layout_height="43dp"
android:text="前往验证"
android:textSize="13sp"
android:textColor="#ffffff"
android:background="@drawable/background_register_success_verify_button"
android:layout_marginTop="40dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/register_success_verify_text" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/register_verify_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="58dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/register_success_verify_button">
<TextView
android:id="@+id/register_verify_success_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已验证成功,"
android:textSize="14sp"
android:textColor="#999999"
app:layout_constraintTop_toTopOf="@id/register_verify_success_login_button"
app:layout_constraintBottom_toBottomOf="@id/register_verify_success_login_button"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/register_verify_success_login_button"
android:layout_width="50dp"
android:layout_height="18dp"
android:text="去登录"
android:textSize="14sp"
android:textColor="#00aae6"
android:background="@android:color/transparent"
app:layout_constraintStart_toEndOf="@id/register_verify_success_text"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Copyright © 2019 云里云外开源社区 All Rights Reserved"
android:textSize="10sp"
android:textColor="#999999"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.page.EmojiFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="emj"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.page.MoreFragment">
<!-- 分割线 start -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cross_line"
android:layout_width="185dp"
android:layout_height="40dp"
android:background="@drawable/markdown_button_area"
android:layout_marginTop="20dp"
app:layout_constraintStart_toStartOf="@id/more_fragment_left_guide_line"
app:layout_constraintTop_toTopOf="parent">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="CROSS_LINE"
android:onClick="onClick"
android:background="@null"
tools:ignore="OnClick" />
<View
android:layout_width="59dp"
android:layout_height="1dp"
android:background="#999999"
android:layout_marginStart="23dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分割线"
android:textColor="#999999"
android:textSize="12sp"
android:layout_marginEnd="11dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- 分割线 end -->
<!-- 分割虚线 start -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cross_hidden_line"
android:layout_width="185dp"
android:layout_height="40dp"
android:background="@drawable/markdown_button_area"
android:layout_marginTop="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="@id/more_fragment_right_guide_line">
<View
android:layout_width="10dp"
android:layout_height="1dp"
android:background="#999999"
android:layout_marginStart="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
android:layout_width="10dp"
android:layout_height="1dp"
android:background="#999999"
android:layout_marginStart="36dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
android:layout_width="10dp"
android:layout_height="1dp"
android:background="#999999"
android:layout_marginStart="52dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
android:layout_width="10dp"
android:layout_height="1dp"
android:background="#999999"
android:layout_marginStart="68dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分割虚线"
android:textSize="12sp"
android:textColor="#999999"
android:layout_marginEnd="11dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- 分割虚线 end -->
<!-- 超链接 start -->
<Button
android:layout_width="86dp"
android:layout_height="40dp"
android:text="超链接"
android:textSize="12sp"
android:textColor="#999999"
android:layout_marginTop="20dp"
android:stateListAnimator="@null"
android:background="@drawable/markdown_button_area"
app:layout_constraintTop_toBottomOf="@id/cross_line"
app:layout_constraintStart_toStartOf="@id/more_fragment_left_guide_line" />
<!-- 超链接 end -->
<!-- 代码块 start -->
<Button
android:layout_width="86dp"
android:layout_height="40dp"
android:tag="CODE_BLOCK"
android:text="代码块"
android:textSize="12sp"
android:textColor="#999999"
android:layout_marginTop="20dp"
android:stateListAnimator="@null"
android:onClick="onClick"
android:background="@drawable/markdown_button_area"
app:layout_constraintTop_toBottomOf="@id/cross_line"
app:layout_constraintEnd_toEndOf="@id/cross_line"
tools:ignore="OnClick" />
<!-- 代码块 end -->
<!-- 表格 start -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/form_area"
android:layout_width="185dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@drawable/markdown_button_area"
app:layout_constraintTop_toBottomOf="@id/cross_hidden_line"
app:layout_constraintEnd_toEndOf="@id/more_fragment_right_guide_line">
<EditText
android:id="@+id/edit_text_form_row"
android:layout_width="24dp"
android:layout_height="24dp"
android:hint="3"
android:gravity="center"
android:textSize="12sp"
android:textColor="#999999"
android:inputType="number"
android:background="@drawable/background_edit_text_markdown_form"
android:layout_marginStart="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="X"
android:textSize="12sp"
android:textColor="#999999"
android:layout_marginStart="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/edit_text_form_row" />
<EditText
android:id="@+id/edit_text_form_line"
android:layout_width="24dp"
android:layout_height="24dp"
android:hint="3"
android:gravity="center"
android:textSize="12sp"
android:textColor="#999999"
android:inputType="number"
android:background="@drawable/background_edit_text_markdown_form"
android:layout_marginStart="31dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/edit_text_form_row" />
<Button
android:layout_width="75dp"
android:layout_height="40dp"
android:text="表格"
android:textSize="12sp"
android:textColor="#999999"
android:background="@null"
android:tag="TABLE"
android:onClick="onClick"
android:stateListAnimator="@null"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:ignore="OnClick" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- 表格 end -->
<!-- 添加封面图 start -->
<Button
android:id="@+id/button_add_cover"
android:layout_width="185dp"
android:layout_height="120dp"
android:layout_marginTop="20dp"
android:text="添加封面图"
android:textSize="12sp"
android:textColor="#999999"
android:onClick="addCover"
android:stateListAnimator="@null"
android:background="@drawable/markdown_button_area"
app:layout_constraintTop_toBottomOf="@id/form_area"
app:layout_constraintStart_toStartOf="@id/more_fragment_left_guide_line"
tools:ignore="OnClick" />
<!-- 添加封面图 end -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/more_fragment_left_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="12dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/more_fragment_right_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="12dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.page.OtherFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="250dp"
android:layout_height="40dp"
android:layout_marginStart="4dp"
android:layout_marginTop="20dp"
android:background="@drawable/markdown_button_area"
app:layout_constraintStart_toStartOf="@id/other_fragment_left_guide_line"
app:layout_constraintTop_toTopOf="parent">
<ImageButton
android:id="@+id/button_align_left"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@null"
android:scaleType="centerInside"
android:layout_marginStart="30dp"
android:src="@drawable/icon_align_left"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/button_align_center"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@null"
android:scaleType="centerInside"
android:src="@drawable/icon_align_center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/button_align_right"
app:layout_constraintStart_toEndOf="@id/button_align_left"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/button_align_right"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@null"
android:scaleType="centerInside"
android:layout_marginEnd="30dp"
android:src="@drawable/icon_align_right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@drawable/markdown_button_area"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="@id/other_fragment_right_guide_line">
<ImageButton
android:id="@+id/button_ordered_list"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/icon_ordered_list"
android:scaleType="centerInside"
android:tag="ORDERED_LIST"
android:onClick="onClick"
android:background="@null"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/button_unordered_list"
tools:ignore="OnClick" />
<ImageButton
android:id="@+id/button_unordered_list"
android:tag="UNORDERED_LIST"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/icon_unordered_list"
android:scaleType="centerInside"
android:background="@null"
android:onClick="onClick"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/button_ordered_list"
app:layout_constraintEnd_toEndOf="parent"
tools:ignore="OnClick" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/other_fragment_left_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="12dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/other_fragment_right_guide_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="12dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.page.PictureFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="picture"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -13,4 +13,9 @@
<color name="colorGray">#666666</color>
<color name="colorTextAccent">#333333</color>
<color name="colorBackgroundTopicTouched">#3000AAE6</color>
<color name="button_on_focus">#2f2f2f</color>
<color name="button_lose_focus">#999999</color>
<color name="colorBackgroundPostWritingChoice">#f5f8fa</color>
<color name="dividerColor">#e6e5e6</color>
</resources>
......@@ -31,6 +31,16 @@
<string name="icon_collect">&#xe61c;</string>
<string name="icon_qr_code">&#xe61d;</string>
<string name="icon_female">&#xe620;</string>
<string name="icon_link">&#xe601;</string>
<string name="icon_code">&#xe61e;</string>
<string name="icon_topic_choose">&#xe61f;</string>
<string name="icon_eye_slash">&#xe621;</string>
<string name="icon_password_visibility">&#xe65e;</string>
<string name="icon_password_hidden">&#xe621;</string>
<string name="icon_close">&#xe622;</string>
<string name="icon_comment">&#xe623;</string>
<string name="icon_forward">&#xe624;</string>
<string name="tag_key_post_id">tag_key_post_id</string>
<!-- icons end -->
<!-- QR_code_card start-->
......@@ -56,4 +66,9 @@
<string name="icon_code">&#xe61e;</string>
<string name="icon_topic_choose">&#xe61f;</string>
<!--public_project end-->
<string name="post_hint">哈哈哈,我有个新鲜事要告诉大家~</string>
<string name="topic_name"># 123 #</string>
<string name="topic_data">56万讨论·1.5亿阅读</string>
<string name="topic_edit">编辑</string>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment