Commit 86e06a30 by amateur

1

1 parent 1ff6b395
...@@ -5,37 +5,36 @@ import com.alibaba.fastjson.annotation.JSONField; ...@@ -5,37 +5,36 @@ import com.alibaba.fastjson.annotation.JSONField;
public class AdvertisementBean { public class AdvertisementBean {
@JSONField(name = "picUrl") @JSONField(name = "picUrl")
String picUrl; private String picUrl;
@JSONField(name = "linkUrl") @JSONField(name = "insideUrl")
String linkUrl; private String insideUrl;
@JSONField(name = "outsideUrl")
private String outsideUrl;
@JSONField(name = "linkType") @JSONField(name = "linkType")
String linkType; private String linkType;
@JSONField(name = "isShare") @JSONField(name = "isShare")
int isShare; private String isShare;
@JSONField(name = "isLogin") @JSONField(name = "isLogin")
int isLogin; private String isLogin;
public String getPicUrl() { public String getPicUrl() {
return picUrl; return picUrl;
} }
public String getLinkUrl() {
return linkUrl;
}
public String getLinkType() { public String getLinkType() {
return linkType; return linkType;
} }
public int getIsShare() { public String getIsShare() {
return isShare; return isShare;
} }
public int getIsLogin() { public String getIsLogin() {
return isLogin; return isLogin;
} }
...@@ -43,19 +42,31 @@ public class AdvertisementBean { ...@@ -43,19 +42,31 @@ public class AdvertisementBean {
this.picUrl = picUrl; this.picUrl = picUrl;
} }
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public void setLinkType(String linkType) { public void setLinkType(String linkType) {
this.linkType = linkType; this.linkType = linkType;
} }
public void setIsShare(int isShare) { public void setIsShare(String isShare) {
this.isShare = isShare; this.isShare = isShare;
} }
public void setIsLogin(int isLogin) { public void setIsLogin(String isLogin) {
this.isLogin = isLogin; this.isLogin = isLogin;
} }
public String getOutsideUrl() {
return outsideUrl;
}
public void setOutsideUrl(String outsideUrl) {
this.outsideUrl = outsideUrl;
}
public String getInsideUrl() {
return insideUrl;
}
public void setInsideUrl(String insideUrl) {
this.insideUrl = insideUrl;
}
} }
...@@ -3,7 +3,7 @@ package com.polysoft.nafmii.fragment; ...@@ -3,7 +3,7 @@ package com.polysoft.nafmii.fragment;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.CountDownTimer; import android.os.CountDownTimer;
import android.util.Log; import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
...@@ -15,22 +15,23 @@ import androidx.annotation.Nullable; ...@@ -15,22 +15,23 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.DrawableImageViewTarget; import com.bumptech.glide.request.target.DrawableImageViewTarget;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.polysoft.nafmii.bean.AdvertisementBean;
import com.polysoft.nafmii.utils.IntentUtils; import com.polysoft.nafmii.utils.IntentUtils;
import com.polysoft.nafmii.viewmodel.AdvertisementViewModel;
import com.whaty.nafmii.R; import com.whaty.nafmii.R;
import com.whaty.nafmii.activity.AdvertisementWebviewActvity; import com.whaty.nafmii.activity.AdvertisementWebviewActvity;
import com.whaty.nafmii.activity.IActivityEvent; import com.whaty.nafmii.activity.IActivityEvent;
import com.whaty.nafmii.activity.TestHomeActivity;
public class AdvertisementFragment extends Fragment implements View.OnClickListener { public class AdvertisementFragment extends Fragment implements View.OnClickListener {
private final String TAG = AdvertisementFragment.class.getName();
private ImageView mImgView; private ImageView mImgView;
private TextView mCountDown; private TextView mCountDown;
private boolean finished = false; private boolean finished = false;
private View mRootView;
public static AdvertisementFragment newInstance(String data) { public static AdvertisementFragment newInstance(String data) {
AdvertisementFragment fragment = new AdvertisementFragment(); AdvertisementFragment fragment = new AdvertisementFragment();
...@@ -43,24 +44,25 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe ...@@ -43,24 +44,25 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_advertisement, container, false); if (null == this.mRootView) {
this.mRootView = inflater.inflate(R.layout.fragment_advertisement, container, false);
this.initView(this.mRootView);
} else {
((ViewGroup) this.mRootView.getParent()).removeView(this.mImgView);
}
return this.mRootView;
} }
@Override private void initView(View view) {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.advertisement_pass).setOnClickListener(this); view.findViewById(R.id.advertisement_pass).setOnClickListener(this);
this.mImgView = view.findViewById(R.id.advertisement_imgview); this.mImgView = view.findViewById(R.id.advertisement_imgview);
this.mCountDown = view.findViewById(R.id.advertisement_countdown); this.mCountDown = view.findViewById(R.id.advertisement_countdown);
this.mImgView.setOnClickListener(this); this.mImgView.setOnClickListener(this);
// this.loadAdvertisementImage();
this.loadAdvertisementImageTest(); this.loadAdvertisementImageTest();
// this.loadAdvertisementImage();
} }
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v.getId() == R.id.advertisement_pass) { if (v.getId() == R.id.advertisement_pass) {
...@@ -74,13 +76,13 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe ...@@ -74,13 +76,13 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
private void loadAdvertisementImage() { private void loadAdvertisementImage() {
String json = getArguments().getString("data"); String json = getArguments().getString("data");
JSONObject item = JSON.parseObject(json); if (TextUtils.isEmpty(json)) {
String id = item.getString("id"); this.dispatchActivityEvent();
String description = item.getString("description"); return;
String picture = item.getString("picture"); }
String url = item.getString("url"); AdvertisementBean bean = JSON.parseObject(json, AdvertisementBean.class);
Glide.with(getContext()).load(picture).into(new DrawableImageViewTarget(this.mImgView) { Glide.with(getContext()).load(bean.getPicUrl()).into(new DrawableImageViewTarget(this.mImgView) {
@Override @Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
super.onResourceReady(resource, transition); super.onResourceReady(resource, transition);
...@@ -102,11 +104,12 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe ...@@ -102,11 +104,12 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
@Override @Override
public void onTick(long millisUntilFinished) { public void onTick(long millisUntilFinished) {
long second = millisUntilFinished / unit; long second = millisUntilFinished / unit;
mCountDown.setText(String.format("%ds", second)); mCountDown.setText(String.format("%ds", (second + 1)));
} }
@Override @Override
public void onFinish() { public void onFinish() {
this.cancel();
dispatchActivityEvent(); dispatchActivityEvent();
} }
}.start(); }.start();
......
...@@ -162,14 +162,14 @@ public class OkhttpApi { ...@@ -162,14 +162,14 @@ public class OkhttpApi {
Request request = chain.request(); Request request = chain.request();
Buffer buffer = new Buffer(); Buffer buffer = new Buffer();
request.body().writeTo(buffer); request.body().writeTo(buffer);
buffer.close();
Log.d(TAG, String.format("request:{%n url:%s,%n headers:{%n%s},%n body:%s%n}", request.url(), request.headers(), buffer.readUtf8()));
Response response = chain.proceed(request); Response response = chain.proceed(request);
ResponseBody resBody = response.body(); ResponseBody resBody = response.body();
String bodyStr = resBody.string(); String bodyStr = resBody.string();
long endTime = System.nanoTime(); long endTime = System.nanoTime();
Log.d(TAG, String.format("response:{%n url:%s,%n headers:{%n%s},%n time:%.1fms,%n body:%s%n ", Log.d(TAG, String.format("response:{%n url:%s,%n time:%.1fms,%n req:%s,%n res:%s%n ",
response.request().url(), response.headers(), (endTime - startTime) / 1e6d, bodyStr)); response.request().url(), (endTime - startTime) / 1e6d, buffer.readUtf8(), bodyStr));
return response.newBuilder().body(ResponseBody.Companion.create(bodyStr, resBody.contentType())).build(); return response.newBuilder().body(ResponseBody.Companion.create(bodyStr, resBody.contentType())).build();
} }
......
...@@ -58,7 +58,7 @@ public abstract class RequestBack<T> { ...@@ -58,7 +58,7 @@ public abstract class RequestBack<T> {
JSONObject data = res.getJSONObject("data"); JSONObject data = res.getJSONObject("data");
this.onResponse(StateEnum.OK, (T) data, null); this.onResponse(StateEnum.OK, (T) data, null);
} else { } else {
T data = JSON.parseObject(json, type); T data = JSON.parseObject(json, arguments[0]);
this.onResponse(StateEnum.OK, data, null); this.onResponse(StateEnum.OK, data, null);
} }
} else { } else {
......
...@@ -5,7 +5,7 @@ import android.os.Handler; ...@@ -5,7 +5,7 @@ import android.os.Handler;
public class TimerUtils { public class TimerUtils {
public static void setTimeOut(Handler.Callback callback, long millisInFuture) { public static void setTimeout(TimerFinishBack back, long millisInFuture) {
new CountDownTimer(millisInFuture, 1000) { new CountDownTimer(millisInFuture, 1000) {
@Override @Override
public void onTick(long millisUntilFinished) { public void onTick(long millisUntilFinished) {
...@@ -13,8 +13,32 @@ public class TimerUtils { ...@@ -13,8 +13,32 @@ public class TimerUtils {
@Override @Override
public void onFinish() { public void onFinish() {
callback.handleMessage(null); this.cancel();
back.onFinish();
} }
}.start(); }.start();
} }
public static void setTimeout(TimerTickBack back, long millisInFuture) {
new CountDownTimer(millisInFuture, 1000) {
@Override
public void onTick(long millisUntilFinished) {
if (back.onTick(millisUntilFinished)) {
this.cancel();
}
}
@Override
public void onFinish() {
}
}.start();
}
public interface TimerFinishBack {
void onFinish();
}
public interface TimerTickBack {
boolean onTick(long millisUntilFinished);
}
} }
package com.polysoft.nafmii.viewmodel; package com.polysoft.nafmii.viewmodel;
import android.app.Activity;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
import com.polysoft.nafmii.bean.AdvertisementBean;
import com.polysoft.nafmii.constants.ServerApi; import com.polysoft.nafmii.constants.ServerApi;
import com.polysoft.nafmii.database.ObjectBox;
import com.polysoft.nafmii.database.entity.DataEntity;
import com.polysoft.nafmii.enums.StateEnum; import com.polysoft.nafmii.enums.StateEnum;
import com.polysoft.nafmii.net.RequestBack; import com.polysoft.nafmii.net.RequestBack;
import com.polysoft.nafmii.utils.TimerUtils; import com.polysoft.nafmii.utils.TimerUtils;
...@@ -22,8 +20,10 @@ import com.whaty.nafmii.BuildConfig; ...@@ -22,8 +20,10 @@ import com.whaty.nafmii.BuildConfig;
public class AdvertisementViewModel extends ViewModel { public class AdvertisementViewModel extends ViewModel {
private MutableLiveData<LiveData> dataModel = new MutableLiveData<>(); private final MutableLiveData<LiveData> dataModel = new MutableLiveData<>();
private final LifecycleOwner owner; private final LifecycleOwner owner;
private final String DB_KEY = "advertisement";
private boolean isSetModelValue = false;
public static AdvertisementViewModel newInstance(FragmentActivity owner) { public static AdvertisementViewModel newInstance(FragmentActivity owner) {
ViewModelProvider.Factory factory = new ViewModelProvider.Factory() { ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {
...@@ -46,25 +46,36 @@ public class AdvertisementViewModel extends ViewModel { ...@@ -46,25 +46,36 @@ public class AdvertisementViewModel extends ViewModel {
this.dataModel.observe(this.owner, observer); this.dataModel.observe(this.owner, observer);
} }
private void fetchData() { private void fetchData() {
ServerApi.postAdvertisement(new RequestBack<AdvertisementBean>() { TimerUtils.setTimeout(() -> {
DataEntity entity = ObjectBox.findByName(DB_KEY);
this.postModelValue(null == entity ? null : entity.getValue());
}, 2000);
ServerApi.postAdvertisement(new RequestBack<String>() {
@Override @Override
protected void onResponse(StateEnum state, AdvertisementBean data, String message) { protected void onResponse(StateEnum state, String data, String message) {
if (state.state == StateEnum.OK.state) { if (state.state == StateEnum.OK.state) {
dataModel.setValue(new LiveData(data)); postModelValue(data);
ObjectBox.put(new DataEntity(DB_KEY, data));
} else { } else {
dataModel.setValue(new LiveData(null)); postModelValue(null);
} }
} }
}); });
} }
private synchronized void postModelValue(String value) {
if (!this.isSetModelValue) {
this.isSetModelValue = true;
this.dataModel.postValue(new LiveData(value));
}
}
public static class LiveData { public static class LiveData {
public final AdvertisementBean data; public final String data;
LiveData(AdvertisementBean data) { LiveData(String data) {
this.data = data; this.data = data;
} }
...@@ -72,7 +83,7 @@ public class AdvertisementViewModel extends ViewModel { ...@@ -72,7 +83,7 @@ public class AdvertisementViewModel extends ViewModel {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
return false; return false;
} }
return null == this.data || TextUtils.isEmpty(this.data.getPicUrl()); return TextUtils.isEmpty(data);
} }
} }
......
...@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentTransaction; ...@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentTransaction;
import com.polysoft.nafmii.utils.StatusBarUtils; import com.polysoft.nafmii.utils.StatusBarUtils;
import com.polysoft.nafmii.utils.ToastUtils; import com.polysoft.nafmii.utils.ToastUtils;
import java.util.List;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
...@@ -74,6 +75,24 @@ public class BaseActivity extends AppCompatActivity implements IActivityEvent { ...@@ -74,6 +75,24 @@ public class BaseActivity extends AppCompatActivity implements IActivityEvent {
return super.getSupportFragmentManager().findFragmentByTag(tag); return super.getSupportFragmentManager().findFragmentByTag(tag);
} }
public List<Fragment> getFragments() {
return super.getSupportFragmentManager().getFragments();
}
public boolean isFragmentExists(Class<? extends Fragment> c) {
List<Fragment> fragments = this.getFragments();
for (Fragment fragment : fragments) {
if (fragment.getClass().getName().equals(c.getName())) {
return true;
}
}
return false;
}
public boolean isFragmentExists(String fragmentKey) {
return null != this.findFragmentTag(fragmentKey);
}
@Override @Override
public void dispatchEvent(String event) { public void dispatchEvent(String event) {
......
package com.whaty.nafmii.activity; package com.whaty.nafmii.activity;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
...@@ -23,6 +22,7 @@ import com.whaty.nafmii.R; ...@@ -23,6 +22,7 @@ import com.whaty.nafmii.R;
public class MainActivity extends BaseActivity { public class MainActivity extends BaseActivity {
private AdvertisementViewModel.LiveData mAdvertisementData; private AdvertisementViewModel.LiveData mAdvertisementData;
private final String FIRST_RUN_KEY = getFirstRunKey();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -46,7 +46,7 @@ public class MainActivity extends BaseActivity { ...@@ -46,7 +46,7 @@ public class MainActivity extends BaseActivity {
@Override @Override
public void dispatchEvent(String event) { public void dispatchEvent(String event) {
if (IActivityEvent.EVENT_GUIDE.equals(event)) { if (IActivityEvent.EVENT_GUIDE.equals(event)) {
SpUtils.putBoolean(getFirstRunKey(), true); SpUtils.putBoolean(FIRST_RUN_KEY, true);
IntentUtils.startActivity(this, TestHomeActivity.class); IntentUtils.startActivity(this, TestHomeActivity.class);
} else if (IActivityEvent.EVENT_ADVERTISEMENT.equals(event)) { } else if (IActivityEvent.EVENT_ADVERTISEMENT.equals(event)) {
IntentUtils.startActivity(this, TestHomeActivity.class); IntentUtils.startActivity(this, TestHomeActivity.class);
...@@ -65,9 +65,8 @@ public class MainActivity extends BaseActivity { ...@@ -65,9 +65,8 @@ public class MainActivity extends BaseActivity {
// 必要读写权限申请失败 // 必要读写权限申请失败
if (!PermissionUtils.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { if (!PermissionUtils.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ToastUtils.showLong("请授权APP必要运行权限"); ToastUtils.showLong("请授权APP必要运行权限");
TimerUtils.setTimeOut(msg -> { TimerUtils.setTimeout(() -> {
PermissionUtils.toAppSetting(MainActivity.this); PermissionUtils.toAppSetting(MainActivity.this);
return false;
}, 2000); }, 2000);
return false; return false;
} }
...@@ -75,32 +74,42 @@ public class MainActivity extends BaseActivity { ...@@ -75,32 +74,42 @@ public class MainActivity extends BaseActivity {
} }
private void showLayout() { private void showLayout() {
AdvertisementViewModel.newInstance(this).observe(data -> this.mAdvertisementData = data); AdvertisementViewModel.newInstance(this).observe(data -> {
this.mAdvertisementData = data;
this.showAdvertisement();
});
// 延时2秒获取广告数据 // 延时2秒获取广告数据
TimerUtils.setTimeOut(msg -> { TimerUtils.setTimeout(() -> {
if (!SpUtils.getBoolean(this.getFirstRunKey(), false)) { if (!this.isFirstRun()) {
FragmentTransaction transaction = super.newFragmentTransaction(); FragmentTransaction transaction = super.newFragmentTransaction();
transaction.replace(R.id.main_framelayout, GuideFragment.newInstance()).commit(); transaction.replace(R.id.main_framelayout, GuideFragment.newInstance()).commit();
} else { } else {
this.showAdvertisement(); this.showAdvertisement();
} }
return false;
}, 2000); }, 2000);
} }
private synchronized void showAdvertisement() { private synchronized void showAdvertisement() {
if (null == this.mAdvertisementData || this.mAdvertisementData.empty()) { boolean isReturn = null == this.mAdvertisementData || !this.isFirstRun();
if (isReturn || super.isFragmentExists(AdvertisementFragment.class)) {
return;
}
if (this.mAdvertisementData.empty()) {
this.dispatchEvent(IActivityEvent.EVENT_ADVERTISEMENT); this.dispatchEvent(IActivityEvent.EVENT_ADVERTISEMENT);
return; return;
} }
FragmentTransaction transaction = super.newFragmentTransaction(); FragmentTransaction transaction = super.newFragmentTransaction();
Fragment fragment = AdvertisementFragment.newInstance(""); Fragment fragment = AdvertisementFragment.newInstance(this.mAdvertisementData.data);
transaction.replace(R.id.main_framelayout, fragment).commit(); transaction.replace(R.id.main_framelayout, fragment).commit();
} }
@SuppressLint("DefaultLocale") private boolean isFirstRun() {
private String getFirstRunKey() { return SpUtils.getBoolean(FIRST_RUN_KEY, false);
}
private static String getFirstRunKey() {
int versionCode = CtxUtils.getPackageInfo().versionCode; int versionCode = CtxUtils.getPackageInfo().versionCode;
return String.format("ISFIRSTRUN_%d", versionCode); return String.format("ISFIRSTRUN_%d", versionCode);
} }
......
<?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/white">
<FrameLayout
android:id="@+id/advertisement_framelayout"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file \ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".fragment.AdvertisementFragment"> tools:context="com.polysoft.nafmii.fragment.AdvertisementFragment">
<ImageView <ImageView
android:id="@+id/advertisement_imgview" android:id="@+id/advertisement_imgview"
...@@ -16,25 +16,34 @@ ...@@ -16,25 +16,34 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <LinearLayout
android:id="@+id/advertisement_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5s"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="@+id/advertisement_pass"
app:layout_constraintEnd_toStartOf="@+id/advertisement_pass"
app:layout_constraintTop_toTopOf="@+id/advertisement_pass" />
<TextView
android:id="@+id/advertisement_pass" android:id="@+id/advertisement_pass"
android:layout_width="wrap_content" android:layout_width="80dp"
android:layout_height="wrap_content" android:layout_height="30dp"
android:layout_marginTop="40dp" android:layout_marginTop="50dp"
android:layout_marginRight="40dp" android:layout_marginRight="20dp"
android:padding="20dp" android:background="@mipmap/advertisement_pass"
android:text="跳过" android:gravity="center"
android:textSize="20sp" android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳过"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/advertisement_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="5s"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file \ No newline at end of file
...@@ -3,17 +3,16 @@ ...@@ -3,17 +3,16 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
tools:context=".fragment.WebViewFragment">
<LinearLayout <LinearLayout
android:id="@+id/webview_layout" android:id="@+id/webview_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"></LinearLayout>
android:orientation="vertical"></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fitsSystemWindows="false"
android:gravity="center">
<TextView
android:id="@+id/test_fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textSize="30sp" />
</LinearLayout>
\ No newline at end of file \ No newline at end of file

1.7 KB | W: | H:

796 Bytes | W: | H:

app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!