我有以下内容:
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
Run Code Online (Sandbox Code Playgroud)
我添加这个以获得更清晰的UI:
android:paddingEnd="16dp"
android:paddingStart="16dp"
Run Code Online (Sandbox Code Playgroud)
但是,现在滚动条位于填充内部,看起来很时髦.所以我补充说:
android:scrollbarStyle="outsideInset"
Run Code Online (Sandbox Code Playgroud)
滚动条现在位于填充之外,但是,滚动条仍然在填充内部.
如何让覆盖滚动的光线在衬垫上伸展?
编辑:
以下是遇到与上述相同问题的完整布局代码.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView 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:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
Run Code Online (Sandbox Code Playgroud) android android-layout android-scrollview android-view android-recyclerview
我的项目中有以下方法
public void execute(final int apiId, final ResponseHandler handler, final Type type)
Run Code Online (Sandbox Code Playgroud)
并使用TypeToken确定类型,如下所示
final Type serviceErrorType = new TypeToken<>() {
}.getType();
Run Code Online (Sandbox Code Playgroud)
我在这里浏览了这个链接,但完全无法理解Type和TypeToken
任何人都可以分享链接或帮助理解这两个概念吗?
我遇到了一个我无法弄清楚的问题.我根据这个示例编写了一个简单的自定义IME键盘.
它基本上有两个自定义键盘,一个用于字母,一个用于数字.他们使用不同的布局.
但是,当我EditText为文本添加两个控件时,为数字添加一个控件时,键盘不会刷新到它所属的类型.我的意思是,如果我选择了EditText与inputType="text"第一,QWERTY键盘布局出现.但后来当我选择第二个EditText与inputType="number"QWERTY键盘再次出现.但是,它应该为连接到代码中的数字加载不同的布局.
换句话说,这是测试活动布局:
现在,如果我选择"文本"字段,QWERTY键盘将显示如下:
但是,如果我选择"数字"字段,QWERTY键盘仍会显示错误.
预期的行为将是这个键盘出现.
这是CustomIME的代码,我试图postInvalidate()在视图上使用,预加载所有布局onInitializeInterface()但没有任何效果.它永远不会正确切换到数字的布局
public class CustomIME extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {
public static final String CUSTOM_IME = "CUSTOM_IME";
private KeyboardView mKeyboardView;
private Keyboard mKeyboardCurrent;
private KeyboardType mKeyboardTypeCurrent = KeyboardType.QWERTY_LETTERS;
private boolean mCAPs = false;
enum KeyboardType {
QWERTY_LETTERS,
NUMBERS
}
@Override
public View onCreateInputView() {
loadCurrentKeyboard();
mKeyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.custom_ime_keyboard, null);
mKeyboardView.setBackgroundResource(R.drawable.btn_gradient);
mKeyboardView.setOnKeyboardActionListener(this);
if (mKeyboardCurrent != null) {
mKeyboardView.setKeyboard(mKeyboardCurrent); …Run Code Online (Sandbox Code Playgroud) java android android-layout android-softkeyboard android-edittext
class SlideshowViewModel : ViewModel() {
@Inject lateinit var mediaItemRepository : MediaItemRepository
fun init() {
What goes here?
}
Run Code Online (Sandbox Code Playgroud)
所以我正在尝试学习Dagger2,这样我就可以让我的应用程序更加可测试.问题是,我已经集成了Kotlin并正在研究Android Architectural组件.我知道构造函数注入是优选的,但这是不可能的ViewModel.相反,我可以使用lateinit以便注射,但我不知道如何注射.
我是否需要创建一个Componentfor SlideshowViewModel,然后注入它?或者我使用该Application组件?
gradle这个:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
kapt {
generateStubs = true
}
dependencies {
compile "com.google.dagger:dagger:2.8"
annotationProcessor "com.google.dagger:dagger-compiler:2.8"
provided 'javax.annotation:jsr250-api:1.0'
compile 'javax.inject:javax.inject:1'
}
Run Code Online (Sandbox Code Playgroud)
应用组件
@ApplicationScope
@Component (modules = PersistenceModule.class)
public interface ApplicationComponent {
void injectBaseApplication(BaseApplication baseApplication);
}
Run Code Online (Sandbox Code Playgroud)
BaseApplication
private static ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate(); …Run Code Online (Sandbox Code Playgroud) 我正在使用dagger2库.每当我试图运行我的项目时,都表示无法创建视图模型类的实例.
我正在尝试创建实例的主要活动
((MovieApplication) getApplication()).getAppComponent().inject(this);
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
Run Code Online (Sandbox Code Playgroud)
我的工厂班
public class ViewModelFactory implements ViewModelProvider.Factory {
private MoviesDataViewModel mViewModel;
@Inject
public ViewModelFactory(MoviesDataViewModel viewModel) {
this.mViewModel = viewModel;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(MoviesDataViewModel.class)) {
return (T) mViewModel;
}
throw new IllegalArgumentException("Unknown class name");
}
Run Code Online (Sandbox Code Playgroud)
我的日志
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.moviedata.viewmodel.MoviesDataViewModel
at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145)
at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96)
at com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:6321)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
at android.app.ActivityThread.access$1100(ActivityThread.java:154)
at …Run Code Online (Sandbox Code Playgroud) android dependency-injection dagger dagger-2 android-architecture-components
Android Studio 3.0 Beta 5
robolectric:3.3.1
Run Code Online (Sandbox Code Playgroud)
我有一个以下视图持有者使用滑动库加载图像URL.我试图找到一种单元测试的方法:
public class MovieActorsViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.civActorPicture) CircleImageView actorPicture;
@BindView(R.id.tvName) TextView name;
@BindView(R.id.tvCharacter) TextView character;
private Context context;
public MovieActorsViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
context = itemView.getContext();
}
public void populateActor(Actor actor) {
Glide.with(context)
.load(actor.getPicturePath())
.placeholder(R.drawable.people_placeholder)
.into(actorPicture);
name.setText(actor.getName());
character.setText(actor.getCharacter());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我所做的单元测试,但我不知道如何对图像视图进行单元测试.我不确定使用Mockito模拟Glide库会起作用吗?
@RunWith(RobolectricTestRunner.class)
public class MovieActorsViewHolderTest {
private MovieActorsViewHolder movieActorsViewHolder;
@Before
public void setup() {
final Context context = ShadowApplication.getInstance().getApplicationContext();
final View view = LayoutInflater.from(context).inflate(R.layout.movie_actors_item, new LinearLayout(context));
movieActorsViewHolder = new MovieActorsViewHolder(view);
} …Run Code Online (Sandbox Code Playgroud) 我有一个RelativeLayout需要圆形的左上角和右上角.我可以使用XML定义的可绘制背景来实现这一点,其中包含角topLeftRadius和topRightRadius.但是......这RelativeLayout也需要有一个背景,它是一个带有平铺位图和形状组合的图层列表,并且平铺的位图在可绘制的XML中没有角参数.所以我的想法是RelativeLayout用以下代码制作一个:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
path.reset();
rect.set(0, 0, w, h);
path.addRoundRect(rect, radius, radius, Path.Direction.CW);
path.close();
}
@Override
protected void dispatchDraw(Canvas canvas) {
int save = canvas.save();
canvas.clipPath(path);
super.dispatchDraw(canvas);
canvas.restoreToCount(save);
}Run Code Online (Sandbox Code Playgroud)
可悲的是没有剪辑发生,我期待它剪辑我的RelativeLayout的所有四个角落,但没有任何事情发生."onSizeChanged"和"dispatchDraw"方法都被调用,我测试过.我也试图关闭硬件加速,但它什么也没做.
我RelativeLayout是一个更大的布局的一部分,并且该布局在子类中膨胀FrameLayout,然后该子类在a中使用a行RecyclerView,如果它改变任何东西.
java android android-custom-view android-layout android-view
几年前,当我尝试FragmentTransaction在onActivityResult()回调中提交内容时,我在我的一个应用程序中遇到了问题.谷歌搜索,我发现这个问题和答案,说
在
onActivityResult()调用时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失.
我最终采用了相同答案推荐的解决方案来应用我的应用程序,生活很美好.然而,最近的实验表明,事情可能已经发生了变化,现在从内部投入可能是安全的.FragmentTransactiononActivityResult()
(支持v4)的文档FragmentManager.beginTransaction()将事务的安全窗口定义为:
注意:只能在活动保存其状态之前创建/提交片段事务.如果您尝试在之后
FragmentActivity.onSaveInstanceState()(以及之后FragmentActivity.onStart或之前)提交事务FragmentActivity.onResume(),您将收到错误.
阅读文档onActivityResult(),我明白了
您将在
onResume()重新启动活动之前立即收到此电话.
这使我相信执行这些事务应该是安全的onActivityResult(),就像onStart()已经被调用的那样,将我置于安全窗口内.
我做了一个应用程序来测试它,我成功地看到了我创建并提交的对话框片段onActivityResult().我有相同的应用程序也记录活动生命周期回调,所以我可以检查他们的订单onStart(),然后onRestoreInstanceState(),我看到,然后onActivityResult()每次.
我错过了什么吗?或者框架已更改,onActivityResult()现在保证是片段交易的安全位置?此行为是否因API级别而异?
我发现了另一个问题和答案似乎与我的文档相同,但两者都超过一年,并没有特别指的是onActivityResult()交易的安全场所.
android android-fragments android-activity android-fragmentactivity fragmentmanager
如何禁用BottomSheetDialogFragment手指拖动?
我看到了类似的问题,但他们BottomSheet都不是BottomSheetDialogFragment.
android android-layout android-view android-dialog bottom-sheet
我尝试用来padding增加按钮的触摸区域.我用
<ImageButton
android:paddingRight="32dp"
android:paddingEnd="32dp"
android:id="@+id/confirm_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?selectableItemBackgroundBorderless"
android:src="?attr/confirmIcon" />
Run Code Online (Sandbox Code Playgroud)
点击区域是放大的.但是,selectableItemBackgroundBorderless点击效果不再显示为完美的圆圈.
我尝试用duplicateParentState技术来克服.
<FrameLayout
android:clickable="true"
android:paddingRight="32dp"
android:paddingEnd="32dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true">
<ImageButton
android:duplicateParentState="true"
android:id="@+id/confirm_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:src="?attr/confirmIcon" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
现在,
selectableItemBackgroundBorderless圆的效果是一个完美的圆.但是,它似乎有一些奇怪的行为.单击实际区域时ImageButton,不显示圆按效果.
我可以知道为什么会这样,我怎么能克服它?我使用API 26进行了测试.
注意,我试图避免使用TouchDelegate技术,除非我被迫,因为它使我们的代码更复杂.
以下是按钮显示的正确行为Toolbar.
当点击区域位于按钮外时,会显示波纹效果
当点击区域在按钮内时,会显示波纹效果
但是,我不知道他们是如何实现这种行为的.
android android-layout android-view android-drawable rippledrawable
android ×10
android-view ×4
java ×3
dagger ×2
dagger-2 ×2
android-architecture-components ×1
bottom-sheet ×1
gson ×1
json ×1
kotlin ×1
robolectric ×1
testing ×1
typetoken ×1
unit-testing ×1