Commit dc262836 by 段启岩

项目详情完成

parent adf2e66b
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
<activity android:name=".MainActivity" /> <activity android:name=".MainActivity" />
<activity android:name=".ui.login.LoginActivity" /> <activity android:name=".ui.login.LoginActivity" />
<activity android:name=".ui.blog.BlogDetailActivity" /> <activity android:name=".ui.blog.BlogDetailActivity" />
<activity android:name=".ui.project.ProjectDetailActivity" />
<activity android:name=".ui.settings.SettingsActivity" /> <activity android:name=".ui.settings.SettingsActivity" />
</application> </application>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
......
...@@ -2,9 +2,6 @@ package cn.yunliyunwai.beyondclouds.data.model; ...@@ -2,9 +2,6 @@ package cn.yunliyunwai.beyondclouds.data.model;
import java.util.Date; import java.util.Date;
import lombok.Data;
@Data
public class Project { public class Project {
private String projectId; private String projectId;
...@@ -17,6 +14,120 @@ public class Project { ...@@ -17,6 +14,120 @@ public class Project {
private Integer commentNumber; private Integer commentNumber;
private Integer praiseNum; private Integer praiseNum;
private Integer viewNumber; private Integer viewNumber;
private String projectDescription;
private boolean followedAuthor;
private String contentHtml;
private Date createTime; private Date createTime;
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getUserNick() {
return userNick;
}
public void setUserNick(String userNick) {
this.userNick = userNick;
}
public Integer getCommentNumber() {
return commentNumber;
}
public void setCommentNumber(Integer commentNumber) {
this.commentNumber = commentNumber;
}
public Integer getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Integer praiseNum) {
this.praiseNum = praiseNum;
}
public Integer getViewNumber() {
return viewNumber;
}
public void setViewNumber(Integer viewNumber) {
this.viewNumber = viewNumber;
}
public String getProjectDescription() {
return projectDescription;
}
public void setProjectDescription(String projectDescription) {
this.projectDescription = projectDescription;
}
public boolean isFollowedAuthor() {
return followedAuthor;
}
public void setFollowedAuthor(boolean followedAuthor) {
this.followedAuthor = followedAuthor;
}
public String getContentHtml() {
return contentHtml;
}
public void setContentHtml(String contentHtml) {
this.contentHtml = contentHtml;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
} }
...@@ -24,4 +24,6 @@ public interface IProjectRepository { ...@@ -24,4 +24,6 @@ public interface IProjectRepository {
void makeCategoriesCache(List<ProjectCategory> categories); void makeCategoriesCache(List<ProjectCategory> categories);
LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize); LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize);
LiveData<Result<Project>> getProject(String projectId);
} }
...@@ -53,4 +53,9 @@ public class ProjectRepositoryImpl implements IProjectRepository { ...@@ -53,4 +53,9 @@ public class ProjectRepositoryImpl implements IProjectRepository {
public LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize) { public LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize) {
return projectApiStore.getHotProjectList(page, pageSize); return projectApiStore.getHotProjectList(page, pageSize);
} }
@Override
public LiveData<Result<Project>> getProject(String projectId) {
return projectApiStore.getProject(projectId);
}
} }
...@@ -9,6 +9,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Project; ...@@ -9,6 +9,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Project;
import cn.yunliyunwai.beyondclouds.data.model.ProjectCategory; import cn.yunliyunwai.beyondclouds.data.model.ProjectCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result; import cn.yunliyunwai.beyondclouds.data.model.Result;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query; import retrofit2.http.Query;
public interface ProjectApiStore { public interface ProjectApiStore {
...@@ -23,4 +24,7 @@ public interface ProjectApiStore { ...@@ -23,4 +24,7 @@ public interface ProjectApiStore {
@GET("project/hots") @GET("project/hots")
LiveData<Result<Page<Project>>> getHotProjectList(@Query("page") Integer page, LiveData<Result<Page<Project>>> getHotProjectList(@Query("page") Integer page,
@Query("size") int pageSize); @Query("size") int pageSize);
@GET("project/{projectId}")
LiveData<Result<Project>> getProject(@Path("projectId") String projectId);
} }
...@@ -17,6 +17,7 @@ import cn.yunliyunwai.beyondclouds.ui.main.HomeFragment; ...@@ -17,6 +17,7 @@ import cn.yunliyunwai.beyondclouds.ui.main.HomeFragment;
import cn.yunliyunwai.beyondclouds.ui.main.MyFragment; import cn.yunliyunwai.beyondclouds.ui.main.MyFragment;
import cn.yunliyunwai.beyondclouds.ui.main.ProjectFragment; import cn.yunliyunwai.beyondclouds.ui.main.ProjectFragment;
import cn.yunliyunwai.beyondclouds.ui.main.QAFragment; import cn.yunliyunwai.beyondclouds.ui.main.QAFragment;
import cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity;
import cn.yunliyunwai.beyondclouds.ui.settings.SettingsActivity; import cn.yunliyunwai.beyondclouds.ui.settings.SettingsActivity;
import dagger.BindsInstance; import dagger.BindsInstance;
import dagger.Component; import dagger.Component;
...@@ -43,6 +44,8 @@ public interface AppComponent { ...@@ -43,6 +44,8 @@ public interface AppComponent {
void inject(SettingsActivity settingsActivity); void inject(SettingsActivity settingsActivity);
void inject(ProjectDetailActivity projectDetailActivity);
void inject(HomeFragment homeFragment); void inject(HomeFragment homeFragment);
void inject(DynamicFragment dynamicFragment); void inject(DynamicFragment dynamicFragment);
......
...@@ -8,6 +8,7 @@ import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel; ...@@ -8,6 +8,7 @@ import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.HomeFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel;
...@@ -78,6 +79,11 @@ public interface ViewModuleBinds { ...@@ -78,6 +79,11 @@ public interface ViewModuleBinds {
@Binds @Binds
@IntoMap @IntoMap
@ViewModelFactory.ViewModelKey(ProjectDetailViewModel.class)
ViewModel bindProjectDetailViewModel(ProjectDetailViewModel projectDetailViewModel);
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(SettingsActivityViewModel.class) @ViewModelFactory.ViewModelKey(SettingsActivityViewModel.class)
ViewModel bindSettingsActivityViewModel(SettingsActivityViewModel settingsActivityViewModel); ViewModel bindSettingsActivityViewModel(SettingsActivityViewModel settingsActivityViewModel);
} }
package cn.yunliyunwai.beyondclouds.ui.main; package cn.yunliyunwai.beyondclouds.ui.main;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.InputType; import android.text.InputType;
import android.view.LayoutInflater; import android.view.LayoutInflater;
...@@ -27,12 +29,15 @@ import cn.yunliyunwai.beyondclouds.databinding.FragmentProjectBinding; ...@@ -27,12 +29,15 @@ import cn.yunliyunwai.beyondclouds.databinding.FragmentProjectBinding;
import cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory; import cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory;
import cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment; import cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment;
import cn.yunliyunwai.beyondclouds.ui.common.listener.OnNavigationReselectedListener; import cn.yunliyunwai.beyondclouds.ui.common.listener.OnNavigationReselectedListener;
import cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity;
import cn.yunliyunwai.beyondclouds.util.CategoryViewpagerUtils; import cn.yunliyunwai.beyondclouds.util.CategoryViewpagerUtils;
import cn.yunliyunwai.beyondclouds.util.ContextUtils; import cn.yunliyunwai.beyondclouds.util.ContextUtils;
import cn.yunliyunwai.beyondclouds.viewmodel.AuthenticationViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.AuthenticationViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.ProjectFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.ProjectListFragmentViewModel;
import static cn.yunliyunwai.beyondclouds.ui.project.ProjectDetailActivity.ARG_PROJECT_ID;
public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, FragmentProjectBinding> implements OnNavigationReselectedListener { public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, FragmentProjectBinding> implements OnNavigationReselectedListener {
...@@ -104,7 +109,18 @@ public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, Frag ...@@ -104,7 +109,18 @@ public class ProjectFragment extends BaseFragment<ProjectFragmentViewModel, Frag
@Override @Override
protected BaseQuickAdapter<Project, BaseViewHolder> createAdapter(CommonCategory category) { protected BaseQuickAdapter<Project, BaseViewHolder> createAdapter(CommonCategory category) {
return new ProjectListRecyclerViewAdapter(R.layout.project_item, category); ProjectListRecyclerViewAdapter adapter = new ProjectListRecyclerViewAdapter(R.layout.project_item, category);
adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
String projectId = adapter.getData().get(i).getProjectId();
Context context = requireActivity();
Intent intent = new Intent(context, ProjectDetailActivity.class);
intent.putExtra(ARG_PROJECT_ID, projectId);
context.startActivity(intent);
}
});
return adapter;
} }
} }
} }
package cn.yunliyunwai.beyondclouds.ui.project;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.base.BaseActivity;
import cn.yunliyunwai.beyondclouds.data.model.UserInfo;
import cn.yunliyunwai.beyondclouds.databinding.ActivityProjectDetailBinding;
import cn.yunliyunwai.beyondclouds.util.ContextUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
import cn.yunliyunwai.beyondclouds.util.HtmlUtils;
import cn.yunliyunwai.beyondclouds.util.StatusBarUtils;
import cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel;
public class ProjectDetailActivity extends BaseActivity<ProjectDetailViewModel, ActivityProjectDetailBinding> {
private static final RequestOptions glideRequestOptions = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.placeholder_circle)
.error(R.drawable.placeholder_circle)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.transform(new GlideRoundTransform(19));
public static final String ARG_PROJECT_ID = "PROJECT_ID";
private String blogId;
@Inject
ViewModelProvider.Factory factory;
@Override
protected void initInject() {
ContextUtils.getAppComponent(this).inject(this);
}
@Override
protected ProjectDetailViewModel initViewModel() {
return new ViewModelProvider(this, factory).get(ProjectDetailViewModel.class);
}
@Override
protected ActivityProjectDetailBinding initDataBinding(LayoutInflater inflater) {
ActivityProjectDetailBinding binding = ActivityProjectDetailBinding.inflate(inflater);
binding.setLifecycleOwner(this);
return binding;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StatusBarUtils.setWindowStatusBarColor(this, R.color.colorStatusBar);
blogId = getIntent().getStringExtra(ARG_PROJECT_ID);
initEventListenersAndObservers();
}
private void initEventListenersAndObservers() {
binding.toolBar.setOnLeftIconClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
WebView webView = binding.webViewArticle;
webView.loadUrl("file:///android_asset/pages/article.html");
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
viewModel.webViewPageFinished();
}
});
viewModel.getLoadState().observe(this, new Observer<ProjectDetailViewModel.LoadState>() {
@Override
public void onChanged(ProjectDetailViewModel.LoadState loadState) {
if (loadState.isLoadComplete()) {
String contentHtml = viewModel.getProject().getValue().getContentHtml();
contentHtml = HtmlUtils.enCode(contentHtml);
webView.evaluateJavascript("javascript:loadArticleContent('" + contentHtml + "')", null);
}
}
});
viewModel.getUserInfo().observe(this, new Observer<UserInfo>() {
@Override
public void onChanged(UserInfo userInfo) {
if (null != userInfo) {
Glide.with(ProjectDetailActivity.this).load(userInfo.getUserAvatar()).apply(glideRequestOptions).into(binding.imageUserAvatar);
}
}
});
viewModel.fetchBlog(blogId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
binding.scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
int articleInfoWrapperHeight = binding.articleInfoWrapper.getHeight();
if (scrollY >= articleInfoWrapperHeight) {
if (viewModel.getProject().getValue() != null) {
binding.toolBar.setTitle(viewModel.getProject().getValue().getProjectName());
}
} else {
binding.toolBar.setTitle("");
}
}
});
}
}
}
package cn.yunliyunwai.beyondclouds.viewmodel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.Project;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.model.UserInfo;
import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository;
import cn.yunliyunwai.beyondclouds.data.source.IUserRepository;
import lombok.Data;
public class ProjectDetailViewModel extends ViewModel {
@Data
public static class LoadState {
private boolean dataLoadComplete;
private boolean webViewPageLoadComplete;
public boolean isLoadComplete() {
return dataLoadComplete
&& webViewPageLoadComplete;
}
}
private IProjectRepository projectRepository;
private IUserRepository userRepository;
private MutableLiveData<Project> project = new MutableLiveData<>();
private MutableLiveData<UserInfo> userInfo = new MutableLiveData<>();
private MutableLiveData<LoadState> loadState = new MutableLiveData<>();
@Inject
public ProjectDetailViewModel(IProjectRepository projectRepository, IUserRepository userRepository) {
this.projectRepository = projectRepository;
this.userRepository = userRepository;
loadState.setValue(new LoadState());
}
public LiveData<Project> getProject() {
return project;
}
public LiveData<LoadState> getLoadState() {
return loadState;
}
public LiveData<UserInfo> getUserInfo() {
return userInfo;
}
public void fetchBlog(String projectId) {
projectRepository.getProject(projectId).observeForever(new Observer<Result<Project>>() {
@Override
public void onChanged(Result<Project> projectResult) {
if (projectResult.getCode() == 0) {
fetchUserInfo(projectResult.getData().getUserId());
project.setValue(projectResult.getData());
LoadState state = loadState.getValue();
state.setDataLoadComplete(true);
loadState.setValue(state);
}
}
});
}
private void fetchUserInfo(String userId) {
userRepository.getUserInfo(userId).observeForever(new Observer<Result<UserInfo>>() {
@Override
public void onChanged(Result<UserInfo> userInfoResult) {
if (userInfoResult.getCode() == 0) {
userInfo.setValue(userInfoResult.getData());
}
}
});
}
public void webViewPageFinished() {
LoadState state = loadState.getValue();
state.setWebViewPageLoadComplete(true);
loadState.setValue(state);
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="cn.yunliyunwai.beyondclouds.viewmodel.ProjectDetailViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWhite"
tools:context=".ui.login.LoginActivity">
<cn.yunliyunwai.beyondclouds.view.BeyondToolBar
android:id="@+id/tool_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:leftIcon="@string/icon_back"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ScrollView
android:id="@+id/scroll_view"
app:layout_constraintTop_toBottomOf="@id/tool_bar"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:paddingStart="12dp"
android:paddingLeft="12dp"
android:paddingEnd="12dp"
android:paddingRight="12dp"
android:paddingBottom="20dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/article_info_wrapper"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 博客基本信息 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/user_info_wrapper"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_user_avatar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/placeholder_circle"
android:layout_width="36dp"
android:layout_height="36dp" />
<TextView
android:id="@+id/txt_user_nick"
android:text='@{viewModel.project == null ? "作者" : viewModel.project.userNick}'
app:layout_constraintStart_toEndOf="@id/image_user_avatar"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="6dp"
android:layout_marginLeft="6dp"
android:textColor="#333333"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txt_user_visit_num"
android:text='@{viewModel.userInfo == null ? "人气0·粉丝0" : "人气" + viewModel.userInfo.statistics.visitedNum + ".粉丝" + viewModel.userInfo.statistics.fansNum}'
app:layout_constraintStart_toEndOf="@id/image_user_avatar"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="6dp"
android:layout_marginLeft="6dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#999999"
android:textSize="10sp" />
<TextView
android:id="@+id/btn_follow_user"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text='@{viewModel.project == null ? "关注" : (viewModel.project.followedAuthor ? "已关注" : "关注")}'
android:clickable="true"
android:background="@drawable/background_white_touchable"
android:textColor='@{viewModel.project == null ? @color/colorUnFollowed : (viewModel.project.followedAuthor ? @color/colorFollowed : @color/colorUnFollowed)}'
android:textSize="13sp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="10dp"
android:paddingLeft="10dp"
android:paddingEnd="10dp"
android:paddingRight="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/txt_title"
android:text='@{viewModel.project == null ? "标题" : viewModel.project.projectName}'
android:textColor="#333333"
android:textSize="21sp"
app:layout_constraintTop_toBottomOf="@id/user_info_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/article_extra_info"
app:layout_constraintTop_toBottomOf="@id/txt_title"
android:layout_marginTop="6dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_create_time"
android:text="2020-2-17 19:53:0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:textColor="#999999"
android:textSize="10sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/article_collect_info"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10dp"
android:textColor="#cccccc"
android:text="@string/icon_message" />
<TextView
android:id="@+id/txt_comment_number"
android:text='@{viewModel.project == null ? "0" : viewModel.project.commentNumber.toString()}'
android:layout_marginStart="2dp"
android:layout_marginLeft="2dp"
android:textSize="10dp"
android:textColor="#cccccc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10dp"
android:textColor="#cccccc"
android:text="@string/icon_heart" />
<TextView
android:id="@+id/txt_praise_number"
android:text='@{viewModel.project == null ? "0" : viewModel.project.praiseNum.toString()}'
android:layout_marginStart="2dp"
android:layout_marginLeft="2dp"
android:textSize="10dp"
android:textColor="#cccccc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<cn.yunliyunwai.beyondclouds.view.BeyondTextIcon
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10dp"
android:textColor="#cccccc"
android:text="@string/icon_eye" />
<TextView
android:id="@+id/txt_view_number"
android:text='@{viewModel.project == null ? "0" : viewModel.project.viewNumber.toString()}'
android:layout_marginStart="2dp"
android:layout_marginLeft="2dp"
android:textSize="10dp"
android:textColor="#cccccc"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<TextView
android:id="@+id/txt_article_category"
android:text='@{viewModel.project == null ? "项目类别" : viewModel.project.category}'
android:background="@drawable/background_article_abstract"
android:layout_marginTop="10dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingStart="10dp"
android:paddingLeft="10dp"
android:paddingEnd="10dp"
android:paddingRight="10dp"
android:textColor="#666666"
android:textSize="12sp"
app:layout_constraintTop_toBottomOf="@id/article_info_wrapper"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txt_article_abstract"
android:text='@{viewModel.project == null ? "" : viewModel.project.projectDescription}'
android:visibility='@{(viewModel.project != null) &amp;&amp; (viewModel.project.projectDescription != null) ? View.VISIBLE : View.GONE}'
android:textColor="#666666"
android:textSize="12sp"
android:background="@drawable/background_article_abstract"
android:layout_marginTop="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="10dp"
android:paddingLeft="10dp"
android:paddingEnd="10dp"
android:paddingRight="10dp"
app:layout_constraintTop_toBottomOf="@id/txt_article_category"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<WebView
android:id="@+id/web_view_article"
android:layout_marginTop="25dp"
android:overScrollMode="never"
app:layout_constraintTop_toBottomOf="@id/txt_article_abstract"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/background_white_touchable" android:background="@drawable/background_white_touchable"
android:clickable="true"
android:paddingStart="12dp" android:paddingStart="12dp"
android:paddingLeft="12dp" android:paddingLeft="12dp"
android:paddingTop="16dp" android:paddingTop="16dp"
......
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