我正在尝试将用户创建的位图保存到设备上的默认“图片”文件夹中。我将从似乎是更常见方法的选项开始:
public void saveImageToExternalStorage(String filename, Bitmap image) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
try {
File directory = new File(path);
if (!directory.exists()) {
directory.mkdirs();
}
File file = new File(directory, filename + ".jpeg");
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这应该保存到“图片”文件夹中,但Environment.getExternalStorageDirectory().getAbsolutePath()
似乎创建了一个这样的新文件结构file://storage/emulated/11/Pictures/
并将图片保存到那个文件夹中。我也试过Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
同样的结果。但这不是我的任何测试设备或模拟器上的默认“图片”文件夹。这让我寻找其他方法,我发现了这个:
public void saveImageToExternalStorage(String filename, Bitmap image) {
try {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); …
Run Code Online (Sandbox Code Playgroud) 我期待着开始使用Marshmallow指纹认证API.我理解要求获得许可,我必须使用以下方法:
ContextCompat.checkSelfPermission(getContext(), Manifest.permission.USE_FINGERPRINT);
Run Code Online (Sandbox Code Playgroud)
我必须检查设备是否正在运行API级别23或更高级别.但在我要求许可之前,我想检查设备是否真的有一个指纹扫描仪开始.我找到了以下两种方法来检查:
FingerprintManager manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
manager.isHardwareDetected();
manager.hasEnrolledFingerprints();
Run Code Online (Sandbox Code Playgroud)
但是这两种方法都需要被USE_FINGERPRINT
许可才能被调用.为什么我要求使用我甚至不知道存在的指纹扫描仪?有没有其他方法可以确定扫描仪是否存在?或者是首先要求许可的唯一方法?
android android-permissions android-6.0-marshmallow android-fingerprint-api
我已经成功地ListView
在一个Fragment
. 从列表中,我还设法成功加载了底部工作表。
如果我点击列表“一个”中的第一项,则会出现底部工作表。
如果我点击底部工作表的外部,底部工作表就会消失。
如果我点击列表中的第二个项目“Two”,底部的表格会再次出现。
如果我再次执行 1) 然后向下滑动底部工作表并尝试执行 3),屏幕将保持灰色,就好像底部工作表仍然显示但不可见...... ???
我该如何纠正?
下面是我的代码。
SecondFragment.java
:
/**
* A simple {@link Fragment} subclass.
*/
public class SecondFragment extends Fragment {
public SecondFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
String[] faList = {
"One",
"Two",
};
ListView listView = (ListView) view.findViewById(R.id.listFa);
ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
getActivity(),
android.R.layout.simple_list_item_1,
faList
);
listView.setAdapter(listviewAdapter);
// …
Run Code Online (Sandbox Code Playgroud) 我正在使用 ThreeTen-Backport (特别是ThreeTenABP)来显示项目中的时间戳。我希望显示的时间戳以本地化格式显示(基于Locale
系统的);使用以下任一方法都很容易DateTimeFormatter.ofLocalizedDateTime()
:
DateTimeFormatter formatter = DateTimeFormatter\n .ofLocalizedDateTime(FormatStyle.LONG)\n .withLocale(Locale.getDefault())\n .withZone(ZoneId.systemDefault());\n\nString timestamp = formatter.format(Instant.now());\n
Run Code Online (Sandbox Code Playgroud)\n\nFormatStyle
问题是我对只有四种类型(SHORT
、MEDIUM
、LONG
、 )的格式化程序的输出没有太多控制FULL
。我很好奇是否有一种方法可以对输出进行更精细的控制,而不丢失本地化格式。
timestamp
使用前面的代码,区域设置的结果"en_US"
将是:
"January 23, 2017 1:28:37 PM EST"\n
Run Code Online (Sandbox Code Playgroud)\n\n虽然区域设置的结果"ja_JP"
是:
"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 13:28:37 GMT-5:00"\n
Run Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,每个区域设置都使用特定的模式,并使用默认的 12 或 24 小时格式。我想保留本地化模式,但更改一些内容,例如是否显示时区,或者是否使用 12 小时或 24 小时格式。
\n\n例如; 如果我可以将两个区域设置设置为使用 12 小时格式,并删除时区;结果如下所示:
\n\n"January 23, 2017 1:28:37 PM"\n\n"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 1:28:37\xe5\x8d\x88\xe5\xbe\x8c"\n
Run Code Online (Sandbox Code Playgroud)\n 我SettingsActivity
目前扩展了Android Studio生成的类,AppCompatPreferenceActivity
扩展了它PreferenceActivity
.活动中的每个首选项屏幕都使用PreferenceFragment
; 从API级别28开始,不推荐使用它.文档声明您应该使用PreferenceFragmentCompat
支持库中的类作为替代.
问题是PreferenceFragmentCompat
扩展android.support.v4.app.Fragment
(而不是android.app.Fragment
)PreferenceActivity
不支持.并没有PreferenceActivityCompat
填补现在无关紧要的角色PreferenceActivity
.
进一步混淆了这个问题; 新的androidx.preference
支持库包括它自己的PreferenceFragment
(扩展android.app.Fragment
)和 PreferenceFragmentCompat
(扩展新的androidx.fragment.app.Fragment
).
我总是可以PreferenceActivity
使用我自己的类重新创建功能,但为什么文档建议使用PreferenceFragmentCompat
没有可行的替代方案PreferenceActivity
?我错过了什么,或者偏好库的当前状态不起作用?
现在的SettingsActivity
工作原样,但我通常想尝试超越曲线,特别是当某些东西被弃用时.
android android-preferences android-support-library androidx
我正在做两个项目; 一个更小(我会称之为ProjectA
),而另一个则相当大(ProjectB
).两个项目都使用相同的库,即IMG.LY的Photo Editor SDK.对于这两个项目,我遵循了库的文档中的简单集成步骤.
ProjectA
使用自定义Activity
来显示和选择图像,而ProjectB
只是使用简单的ACTION_PICK
意图来选择图像.两个项目都有类似的方法来PhotoEditorActivity
选择图像后启动; 除了ProjectA
接受File
参数的方法,而另一个接受一个Uri
:
private void dispatchEditorIntent(File file /* Uri uri */) {
new PhotoEditorIntent(getActivity())
.setExportDir(PhotoEditorIntent.Directory.PICTURES, getString(R.string.app_name))
.setExportPrefix(Constants.PREFIX_EDITOR)
.setSourceImagePath(file.getAbsolutePath()) // uri.getPath() for ProjectB
.destroySourceAfterSave(false)
.startActivityForResult(REQUEST_EDITOR);
}
Run Code Online (Sandbox Code Playgroud)
如果我在任一项目中选择相同的图像,file.getAbsolutePath()
或者uri.getPath()
方法将返回相同的图像String
; 例如:
/storage/emulated/0/Pictures/IMG_20160929_145318_395198580.jpeg
ProjectA
工作正常,但在ProjectB
当dispatchEditorIntent
被调用时,我遇到了一个巨大的错误消息.为简洁起见,我只包括每个错误和警报日志的前10行:
09-29 14:53:26.585 4272-4272/com.example.projectb E/art: Failed to register native method android.support.v8.renderscript.RenderScript.nDeviceDestroy(J)V …
Run Code Online (Sandbox Code Playgroud) 我写了一个自定义的GSON类型适配器android.net.Uri
:
public class UriAdpter extends TypeAdapter<Uri> {
@Override
public void write(JsonWriter out, Uri value) throws IOException {
out.value(value.toString());
}
@Override
public Uri read(JsonReader in) throws IOException {
return Uri.parse(in.nextString());
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,直到我解析的JSON提要给了我一个null
URI 的值.然后它扔了一个JsonSyntaxException
:
03-30 08:40:00.799 16340-16340/com.example.app D/NewsFragment: Failed to retrieve articles
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 23588 path $.data[5].thumbnail
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116) …
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以使用 DataBinding 根据方法布尔响应有条件地显示布局。这就是我想要做的
XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="View"
type="android.view.View"/>
<variable
name="App"
type="com.app.JTApp"/>
</data>
<include layout="@layout/view_checkout_total_cardview"
android:visibility="@{App.isLandscape() ? View.GONE : View.VISIBLE}" />
</layout>
Run Code Online (Sandbox Code Playgroud)
JTApp 类:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="View"
type="android.view.View"/>
<variable
name="App"
type="com.app.JTApp"/>
</data>
<include layout="@layout/view_checkout_total_cardview"
android:visibility="@{App.isLandscape() ? View.GONE : View.VISIBLE}" />
</layout>
Run Code Online (Sandbox Code Playgroud)
目前这不起作用。我错过了什么或者这是不可能的吗?我来自网络,使用 Angular 等框架可以做到这一点。
我试图替换我认为是NavigationView
. 所以我创建了一个 drawable 来替换背景并使用itemBackground
属性应用它。
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/navigation_item_background_tint">
<item android:id="@android:id/mask" android:top="4dp" android:bottom="4dp" android:left="8dp" android:right="8dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/white"/>
<corners android:radius="3dp"/>
</shape>
</item>
<item android:top="4dp" android:bottom="4dp" android:left="8dp" android:right="8dp">
<selector>
<item android:state_checked="true">
<shape android:shape="rectangle">
<solid android:color="@color/navigation_item_background_tint"/>
<corners android:radius="3dp"/>
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<corners android:radius="3dp"/>
</shape>
</item>
</selector>
</item>
</ripple>
Run Code Online (Sandbox Code Playgroud)
当项目被选中时,项目背景可绘制看起来很棒(“选择控件”是下图中的选定项目)。但被点击该项目时(“进度指标”下文)看来该默认波纹绘制两者和所述background_navigation_view_item.xml
可绘制正在使用(仅一个圆角矩形应该显示,而不是周围的矩形)。
我还测试了 drawable 作为可检查视图的背景,它的工作方式符合我的预期。因此,如果我的可绘制对象的代码中没有错误,为什么不替换原始背景可绘制对象?
android android-drawable navigation-drawer android-navigationview android-jetpack
android ×9
androidx ×1
bitmap ×1
bottom-sheet ×1
gson ×1
image ×1
ios ×1
java ×1
json ×1
localization ×1
mediastore ×1
renderscript ×1
save ×1
simulator ×1
threetenbp ×1
xcode ×1
xml ×1