我使用 MPAndroidChart 来显示一个相对简单的条形图。
我需要设置两件事,但我不知道如何自定义:
我需要为每个条添加文本,而不是简单的值,它本身也是样式化的。
在每个条形的顶部,我需要放置各种类型的可绘制对象来覆盖它的宽度(例如,一个条形中的蓝色高度为 2dp,或另一个条形上具有相同高度的黄色渐变)。
这是我需要做的演示:
我已经检查了文档,但到目前为止我唯一发现的是将值放在栏上方,使用setDrawValueAboveBar:https :
//github.com/PhilJay/MPAndroidChart/wiki/Specific-Chart-Settings-&-Styling
我知道我也可以使用 来添加图标,setDrawIcons但这似乎不适用于应该占用整个条宽的可绘制对象。
正如我所写,我想知道上述是否可行,以及如何:
如何在每个条形上方设置自定义的样式值?
如何将不同的 drawable 设置为“坐在”每个栏的顶部?
如果#2 是不可能的(甚至可能是),是否可以将 drawable 设置为条形本身?例如,有些条形是纯灰色,而有些条形具有可绘制的渐变黄色?
AsyncTask我在从简单(已弃用)迁移到Android 时Executors遇到问题Kotlin Coroutines
我无法找到如何执行我可以在AsyncTask甚至Executors使用上完成的基本操作Kotlin Coroutines。
过去,我可以选择在有或没有线程中断的情况下取消任务。现在,出于某种原因,考虑到我在协程上创建的任务,它只是不间断的,这意味着如果我运行一些甚至在其中“睡眠”的代码(并不总是由我执行),它就不会被中断。
我还记得有人告诉我,协程在 Android 上非常好用,因为如果你在 Activity 中,它会自动取消所有任务。但我找不到如何做到这一点的解释。
对于协程任务(Deferred根据我所看到的调用),我想我已经读到,当我创建它时,我必须选择它将支持哪种取消,并且由于某种原因我不能同时拥有它们。不确定这是否属实,但我仍然想知道,因为我想同时拥有两者以获得最佳迁移。我曾经使用 AsyncTask 将它们添加到一个集合中(并在取消时将其删除),以便在 Activity 完成后,我可以查看所有内容并取消它们。我什至为我开设了一个很好的课程。
这是我为了测试这个而创建的:
class MainActivity : AppCompatActivity() {
val uiScope = CoroutineScope(Dispatchers.Main)
val bgDispatcher: CoroutineDispatcher = Dispatchers.IO
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadData()
}
private fun loadData(): Job = uiScope.launch {
Log.d("AppLog", "loadData")
val task = async(bgDispatcher) {
Log.d("AppLog", "bg start")
try {
Thread.sleep(5000L) //this could be any executing …Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-lifecycle android-asynctask kotlin-coroutines
我有一个简单的问题:
假设我对 scrollView(或水平滚动视图)有一些看法。有什么方法可以添加一个监听器,它会告诉我这样的视图何时进入可见区域的内部和外部?
我见过的唯一类似问题是: Android:如何检查 ScrollView 中的视图是否可见? 但我想在发生此类事件时得到通知(变得隐藏/可见)。
在Honeycomb之后,Google表示位图是由堆管理的(这里谈到),所以如果不再可以访问位图,我们可以假设GC处理它并释放它.
我想创建一个演示,显示为listView讲座(从这里)显示的想法的效率,所以我做了一个小应用程序.该应用程序允许用户按下按钮,然后列表视图一直滚动到底部,而它有10000个项目,其内容是android.R.drawable项目(名称和图像).
出于某种原因,即使我没有保存任何图像,我也会内存不足,所以我的问题是:它怎么可能?我错过了什么?
我已经在Galaxy S III上测试了应用程序,但是如果我使用适配器的原生版本,我会不断出现内存异常.我不明白为什么会这样,因为我不存储任何东西.
这是代码:
public class MainActivity extends Activity
{
private static final int LISTVIEW_ITEMS =10000;
long _startTime;
boolean _isMeasuring =false;
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView=(ListView)findViewById(R.id.listView);
final Field[] fields=android.R.drawable.class.getFields();
final LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// listen to scroll events , so that we publish the time only when scrolled to the bottom:
listView.setOnScrollListener(new OnScrollListener()
{
@Override
public void onScrollStateChanged(final AbsListView view,final int scrollState)
{
if(!_isMeasuring||view.getLastVisiblePosition()!=view.getCount()-1||scrollState!=OnScrollListener.SCROLL_STATE_IDLE)
return;
final long …Run Code Online (Sandbox Code Playgroud) android garbage-collection out-of-memory android-3.0-honeycomb android-4.0-ice-cream-sandwich
因此,我决定尝试使用Google IO 2013上显示的新Volley库.
我已经尝试过使用简单的解决方案NetworkImageView来显示多个图像GridView.
它工作得很好,并显示图像,但如果我让它下载图像,然后我在下载过程中关闭WiFi,它不会显示错误,好像一切仍然加载.不仅如此,如果我恢复连接,它不会恢复加载.
为什么会发生,我该如何解决?也许它实际上是一个错误?
这是我的示例代码,如果有人想尝试一下(BitmapCacheLru代码在这里):
public class MainActivity extends Activity {
private static final int COLUMNS_COUNT = 4;
private RequestQueue _requestQueue;
private ImageLoader _imageLoader;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_requestQueue=Volley.newRequestQueue(this);
_imageLoader=new ImageLoader(_requestQueue, new BitmapLruCache());
final GridView gridView = new GridView(this);
gridView.setNumColumns(COLUMNS_COUNT);
final int screenWidth = getResources().getDisplayMetrics().widthPixels;
gridView.setAdapter(new BaseAdapter() {
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
NetworkImageView …Run Code Online (Sandbox Code Playgroud) error-handling android internet-connection android-volley networkimageview
从Android 4.2开始,使用普通API不支持打开/关闭飞行模式.
它应该在授予WRITE_SECURE_SETTINGS权限时起作用,但这仅适用于系统应用程序(正如我所读).
要在具有root的设备上执行该操作应该怎么做?
系统应用程序是否还需要root才能切换飞行模式?
从API 23开始,不建议使用获取颜色getColor(仅通过为其提供资源ID)的小方法:
相反,我们被告知也要使用包含Theme参数的方法:
在API级别23中不推荐使用此方法。请改用getColor(int,Theme)。
文档对的内容不多说theme:
通过Internet搜索,我能找到的就是我们可以使用支持库来获取颜色:
ContextCompat.getColor(context, R.color.color_name);
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为在幕后,似乎并没有对主题做任何事情。这是它的代码:
@ColorInt
public static final int getColor(@NonNull Context context, @ColorRes int id) {
if (Build.VERSION.SDK_INT >= 23) {
return context.getColor(id);
} else {
return context.getResources().getColor(id);
}
}
Run Code Online (Sandbox Code Playgroud)
查看Context.getColor,我可以看到:
在我看来,它使用的是活动的主题?
“主题”参数的目的是什么?
如何使用?是否有关于它的任何样本/教程/文章?
为什么仍然不推荐使用该功能?对我来说仍然可以安全使用...
支持库功能有什么用?与不赞成使用的功能有何不同?
这是一个非常简单的问题:
我正在使用相对较新的Lifecycle 类(android 架构组件库的一部分)以Activity/Fragment更简单的方式处理一些事件。
这是你如何使用它来处理ON_DESTROY事件:
lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
lifecycle.removeObserver(this)
//Do something
}
})
Run Code Online (Sandbox Code Playgroud)
我无法在文档和此处找到,是应该调用removeObserver还是在ON_DESTROY事件时自动完成。
我试图阅读它,现在作为预防措施,我总是调用removeObserver.
它是安全的避免调用removeObserver时ON_DESTROY事件?
我试图拥有更大一点的 BottomNavigationView (高度更大一点),同时还使每个项目图标都有一个顶部指示器,表明它已被选中。
类似的东西,但高度更大:
在屏幕截图中很难看到它,但该指示器显示在 BottomNavigationView 项目的最顶部,位于 BottomNavigationView 阴影的正下方。
当我设置较大的高度时,每个项目仍然采用较小的高度,因此指示器不会看顶部:
不仅如此,因为我曾经itemBackground将每个项目的背景设置为具有指示器,所以现在它没有用于点击效果的背景。
关于高度,我在 StackOverflow 上发现了这个关于更改高度的问题。唯一的解决方案是覆盖库的尺寸。在这种情况下,只有这样:
<dimen name="design_bottom_navigation_height" tools:override="true">...</dimen>
Run Code Online (Sandbox Code Playgroud)
然而,这仅解决了将指标置于顶部的问题。
另外,它看起来像是一个肮脏的解决方案,强制为库设置尺寸,正如我所写,因为我使用了itemBackground,它不再具有正常的点击效果。
这是相关代码,根据Android Studio的向导进行了一些修改,用于制作“底部导航活动”。其余的与那里相同:
活动主文件
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container" 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" tools:context=".MainActivity">
<TextView
android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="@dimen/activity_vertical_margin" android:text="@string/title_home"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view" android:layout_width="0dp"
android:layout_height="@dimen/tabs_height" android:layout_marginEnd="0dp"
android:layout_marginStart="0dp" android:background="?android:attr/windowBackground" app:itemBackground="@drawable/activity_main__tab_background"
app:labelVisibilityMode="unlabeled" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
尺寸.xml
<dimen name="tabs_height">64dp</dimen>
<dimen name="design_bottom_navigation_height" tools:override="true">@dimen/tabs_height</dimen>
Run Code Online (Sandbox Code Playgroud)
Activity_main__tab_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<layer-list>
<item android:gravity="top">
<shape android:shape="rectangle">
<size …Run Code Online (Sandbox Code Playgroud) android ×10
airplane ×1
android-4.0-ice-cream-sandwich ×1
android-architecture-lifecycle ×1
android-view ×1
bar-chart ×1
hide ×1
listener ×1
root ×1
scrollview ×1
transitions ×1
view ×1