我用这个代码用一个Lineargradient做了一个色调渐变:(我知道它本来可以变得更简单Color.parseColor但是我必须这样做.我也不能使用drawable.)
colors = new int[]{ Color.HSVToColor(new float[]{0, 1, 1}),
Color.HSVToColor(new float[]{60, 1, 1}),
Color.HSVToColor(new float[]{120, 1, 1}),
Color.HSVToColor(new float[]{180, 1, 1}),
Color.HSVToColor(new float[]{240, 1, 1}),
Color.HSVToColor(new float[]{300, 1, 1}),
Color.HSVToColor(new float[]{360, 1, 1}) };
Shader shader = new LinearGradient(0, 0, width, 0, colors, null, Shader.TileMode.CLAMP);
paint.setShader(shader);
Run Code Online (Sandbox Code Playgroud)
产生这种结果的颜色略有偏移,绿色区域太小,蓝色区域与预期结果相比太大.
我查了一切.我尝试使用new float[]{0f, 1/6f, 2/6f, 3/6f, 4/6f, 5/6f, 1f}而不是null位置参数,相同的结果.这可能也是一个错误.
请注意,这不是重复这个帖子也不是这一个.这些是关于在代码中设置的不正确的渐变停止,这不是我的情况.它可能与这个有关,但我不知道如何.
编辑:也许这可以通过设置不相等的位置来解决,但我怎样才能计算出这些确切的位置?
我正在尝试实现一种布局,当设备显示在纵向上时显示视图寻呼机,并在设备处于横向时显示两个窗格.
所以我制作了两个不同的布局文件,一个只有一个ViewPager,另一个有一个LinearLayout,另一个有两个FrameLayout,我不认为有必要在这里显示它们.hasTwoPanes两种配置也有一个布尔值.
@Inject FragmentOne fragmentOne;
@Inject FragmentTwo fragmentTwo;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
boolean hasTwoPanes = getResources().getBoolean(R.bool.hasTwoPanes);
TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager viewPager = findViewById(R.id.view_pager);
if (hasTwoPanes) {
tabLayout.setVisibility(View.GONE);
} else {
tabLayout.setVisibility(View.VISIBLE);
tabLayout.setupWithViewPager(viewPager);
viewPager.setAdapter(new MyPagerAdapter(fm));
}
FragmentOne frag1 = (FragmentOne) fm.findFragmentByTag(getFragmentName(0));
if (frag1 != null) fragmentOne = frag1;
FragmentTwo frag2 = (FragmentTwo) fm.findFragmentByTag(getFragmentName(1));
if (frag2 != null) fragmentTwo = frag2;
if (hasTwoPanes) {
if (frag1 != null) {
fm.beginTransaction().remove(fragmentOne).commit();
fm.beginTransaction().remove(fragmentTwo).commit(); …Run Code Online (Sandbox Code Playgroud) android android-configchanges android-fragments android-viewpager
我有一个自定义视图,让我们说这是它的代码:
public class CustomView extends View {
boolean visible;
boolean enabled;
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0);
try {
visible = a.getBoolean(R.styleable.CustomView_visible, true);
enabled = a.getBoolean(R.styleable.CustomView_enabled, true);
} finally {
a.recycle();
}
// Apply XML attributes here
}
@Override
public Parcelable onSaveInstanceState() {
// Save instance state
Bundle bundle = new Bundle();
bundle.putParcelable("superState", super.onSaveInstanceState());
bundle.putBoolean("visible", visible);
bundle.putBoolean("enabled", enabled);
return bundle;
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 成员 lateinit 变量初始化可以通过以下方式检查:
class MyClass {
lateinit var foo: Any
...
fun doSomething() {
if (::foo.isInitialized) {
// Use foo
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此语法不适用于本地 lateinit 变量。Lint 报告错误:“尚不支持对变量的引用”。从逻辑上讲,应该有一种方法可以做到这一点,因为 lateinit 变量在未初始化时在内部为 null。
有没有办法检查局部变量是否已初始化?
我正在尝试在EditText中设置一个大文本,操作可能需要30秒以上,所以我使用ProgressDialog.它显示,但没有动画,然后在操作完成后消失.这是我的简化代码:
class FileOpener extends AsyncTask<File, Integer, String> {
private ProgressDialog progress;
@Override
protected void onPreExecute() {
progress = new ProgressDialog(context);
...
progress.show();
}
@Override
protected StringBuilder doInBackground(File... files) {
return readFile();
}
@Override
protected void onPostExecute(String content) {
EditText editText = ...
editText.post(new Runnable() {
@Override
public void run() {
editText.setText(content);
progress.dismiss();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
在设置文本时,如何设置进度对话框的动画?
我也尝试过使用它onPostExecute,同样的东西,对话框就在那里,但没有动画......
EditText editText = ...
new Thread() {
@Override
public void run() {
editor.setText(content);
progress.dismiss();
}
}.start();
Run Code Online (Sandbox Code Playgroud)
编辑 - 这不是我的EditText速度的问题,这是我理解的可怕.这个问题就在这里 …
目前的答案没有帮助,这个问题没有答案
我创建了一个带有自定义视图的库,可以在创建时扩展布局.布局中的视图使用style="?attr/labelStyle"任何其他属性设置样式.
该属性被声明为库的attrs.xml:
<attr name="myViewStyle" format="reference"/>
<declare-styleable name="MyView">
<attr name="labelStyle" format="reference|color"/>
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
我在库中为此属性设置了一个默认值styles.xml:
<style name="MyViewStyle">
<item name="labelStyle">@style/LabelStyle</item>
</style>
<style name="LabelStyle">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="...">...</item>
</style>
Run Code Online (Sandbox Code Playgroud)
最后在图书馆themes.xml:
<style name="MyViewStyleLight" parent="Theme.AppCompat.Light">
<item name="myViewStyle">@style/MyViewStyle</item>
</style>
Run Code Online (Sandbox Code Playgroud)
现在这是库的默认样式,但它在主项目中被覆盖 styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="myViewStyle">@style/MyViewStyleCustom</item>
</style>
<style name="MyViewStyleCustom" parent="MyViewStyleLight">
<item name="android:textColor">@color/gray</item>
<item name="...">...</item>
</style>
Run Code Online (Sandbox Code Playgroud)
自定义视图代码:
public MyView(Context context) {
this(context, null, R.attr.myViewStyle, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, R.attr.myViewStyle, 0);
}
public MyView(Context …Run Code Online (Sandbox Code Playgroud) 我在IntelliJ IDEA 2019.1.3中使用Gradle创建了一个项目,其主类如下所示:
public final class Main {
public static void main(String[] args) {
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
但是每次我尝试启动程序时,它总是显示相同的错误:
Error: Could not find or load main class com.example.Main
Caused by : java.lang.ClassNotFoundException: com.example.Main
Run Code Online (Sandbox Code Playgroud)
我正在使用应用程序配置模板。我尝试了以下方法:
Main.class该build/文件夹下和生成的jar文件中实际上都有一个文件。我知道的唯一解决方案是使用gradle任务运行:
task run(type: JavaExec) {
main = "com.example.MainKt"
classpath = sourceSets.main.get().runtimeClasspath
standardInput = System.in
isIgnoreExitValue = true
}
Run Code Online (Sandbox Code Playgroud)
但是我宁愿不这样做,因为控制台将不接受输入,由于某种原因不支持unicode,而且我无法像IntelliJ的配置窗口一样容易地传递程序参数。
有谁遇到过这个问题,如何解决?自从我更新到IntelliJ 2019.1以来,这只是我自己发生的事情,它在2018.3.6的大部分时间里都运行良好。
编辑2:最初的问题是关于Kotlin,但我意识到我与Java遇到相同的错误。
我正在做一个具有搜索功能的项目,但只有在搜索的标签被翻译成设备语言时才启用。有什么方法可以检查特定区域设置中是否存在资源?我想避免对哪些翻译可用进行硬编码。
默认情况下,微调器宽度设置为适合下拉列表中的最大项目,但我希望它与所选项目的宽度相同.
<android.widget.Spinner
android:id="@+id/tab_spinner"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:entries="@array/countries" />
Run Code Online (Sandbox Code Playgroud)
正如您在右侧图像中看到的那样,由于列表中的长项目,微调器太长了.
如何将其调整为所选项目宽度?
目前,操作模式工具栏显示在工具栏上方,将整个布局向下移动,我希望它显示在当前工具栏的顶部。我在这篇文章和这篇文章中尝试了所有解决方案:
windowActionModeOverlay和不使用android:前缀,没有成功view.ActionMode和support.v7.view.ActionMode,没有成功setContentView之前被调用super.onCreate,这不是问题现在我只是手动设置工具栏可见性,这看起来很糟糕。另外我之前设置了活动主题super.onCreate,这可能是问题吗?如果不是,那是什么?我怎样才能使属性起作用?
我的活动:
import android.support.v7.view.ActionMode;
import android.support.v7.widget.Toolbar;
// import ...
public class FileExplorerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Theme_NoActionBar);
super.onCreate(savedInstanceState);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// ...
}
private void setActionMode(boolean enabled) {
if (enabled) {
actionMode = startSupportActionMode(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = …Run Code Online (Sandbox Code Playgroud)