我试图掌握onSaveInstanceState课堂上的方法View(而不是课堂上的方法Activity)。该方法确实返回一个Parcelable. View我从该方法中派生ViewGroup并覆盖了该方法以保存我自己的状态。但是当要保存状态时,我遇到了一个例外:
java.lang.IllegalStateException:
Derived class did not call super.onSaveInstanceState()
Run Code Online (Sandbox Code Playgroud)
确实如此,但简单地调用该方法对我来说似乎还不够。那么我应该怎么做呢?如果该方法将传递 aParcel进行写入,我可以简单地将同一个包裹传递给超类,这样事情就会按顺序写入。但这是一个返回值。
我是否应该包含此返回的对象作为我自己的表示的成员Parcelable,并Parcel.writeParcelable在需要时将其与我自己的数据一起封送?或者是否有更好的方法来处理父调用和可分割对象的链接?如果是这样,在加载超类的实例状态时应该使用什么类加载器?
我面临的一个常见情况是,我希望View在将自定义项目作为大型应用程序的一部分进行开发时,在屏幕上以可见方式对其进行测试。我意识到单元测试的存在,特别是使用ActivityUnitTestCase,但据我了解,这些框架实际上并没有在屏幕上可见地附加组件。
目前,我倾向于这样做的方法是将组件放置在应用程序中实际使用的任何位置。这通常意味着需要等待一段时间应用程序启动或在应用程序可见之前浏览应用程序的某些部分,这可能会变得很麻烦。
我发现的更好的方法是在应用程序中创建一个Activity纯粹出于测试目的而存在的应用程序(例如,仅显示我正在开发的自定义View),启动该应用程序以显示我正在处理的自定义View(或其他内容)。为此,我Activity在清单中分配给该过滤器的唯一意图过滤器是android.intent.action.MAIN,而不是 android.intent.category.LAUNCHER。然后,我可以简单地在 Android Studio 中创建一个运行/调试配置来Activity直接启动它。据我认为,这实际上允许我拥有Activity只能由我从 IDE 启动的类。
我的问题是:
省略是否可以android.intent.category.LAUNCHER保证应用程序的用户无法Activity以任何方式启动该应用程序,也无法意识到它的存在?这是一个安全的地方吗Activity只开设用于发展的课程
是否有任何类型的工作流程或测试框架可以用来改进我的做法?
我遇到了图标位置的问题。我已将该图标设置为 TextView 的drawableLeft,这工作正常,但是,如果我将 TextView 的重力设置为 center_horizontal,则图标和文本之间会出现填充空间。代码如下:
<TextView
style="@style/BaseText.White.Bold"
android:gravity="center_horizontal"
android:drawableStart="@drawable/ic_text"
android:drawableLeft="@drawable/ic_text"
android:text="@string/text"
android:layout_marginBottom="@dimen/margin_small"
android:layout_marginRight="@dimen/margin_big"
android:layout_marginLeft="@dimen/margin_big"
android:padding="0dp"
android:drawablePadding="0dp"/>
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能确保图标显示在文本左侧但水平居中?我制作了两个屏幕截图来向您展示添加或删除图标重力时的差异。当textview的重力没有设置时,结果如下:

我需要在片段中实现自定义视图。到目前为止,我已经完成了扩展 View 类以在画布上绘制并将其设置为遵循google example 的活动。
我想在画布上绘制片段,问题是我不知道如何膨胀视图,因为它是对象而不是 xml 文件。
return inflater.inflate(R.layout.article_view, container, false);
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解并解决这个问题吗?
谢谢
android android-custom-view android-layout android-fragments android-view
我有一个自定义视图,我想将它放在 a 中ConstraintLayout,使其底部位于ConstraintLayout.
子视图具有动态高度wrap_content,因此我无法轻松设置固定边距或填充。
我知道我可以将视图的中心与ConstraintLayout使用的中心对齐
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
Run Code Online (Sandbox Code Playgroud)
但正如我所说,我想将视图的底部与ConstraintLayout.
有什么好的方法来实现这一点吗?
android android-layout android-view android-constraintlayout
我buttonViews在垂直线性布局中有 3 个视图 ( )的活动。我正在动态生成(膨胀)这些视图。我想应用一个动画,以便在活动开始时,第一个按钮滑入 -> 100 毫秒延迟 -> 第二个按钮滑入 -> 100 毫秒延迟 -> 第三个按钮滑入。
试图
我尝试以这种方式实现它:
private void setMainButtons() {
ArrayList<String> dashboardTitles = DashboardUtils.getDashboardTitles();
ArrayList<Integer> dashboardIcons = DashboardUtils.getDashboardIcons();
final ViewGroup root = findViewById(R.id.button_container);
for (int i = 0; i < (dashboardTitles.size() < dashboardIcons.size() ? dashboardTitles.size() : dashboardIcons.size()); i++){
final View buttonView = DashboardButtonInflater.getDashboardButton(root, dashboardTitles.get(i), dashboardIcons.get(i), this);
if (buttonView == null) continue;
buttonView.setOnClickListener(this);
root.addView(buttonView);
animateBottomToTop(buttonView, (long) (i*50)); // Calling method to animate buttonView
}
}
//The function that …Run Code Online (Sandbox Code Playgroud) animation android android-animation android-layout android-view
我正在使用自定义视图,我想使用path.lineTo()和path.arcTo()方法构建一个圆角矩形。
所以,我想要得到的矩形:
通常我用这段代码来绘制它:
RectF backReftf = new RectF();
Path path = new Path();
int width = getWidth();
int height = getHeight();
float curve = (float) (0.1 * height);
RectF backReftf = new RectF();
backReftf.left = 0;
backReftf.top = 0;
backReftf.right = width;
backReftf.bottom = height;
path.addRoundRect(backReftf, curve, curve, Path.Direction.CW);
canvas.drawPath(path, paint);
Run Code Online (Sandbox Code Playgroud)
但我想用path.lineTo()和来画这个path.arcTo()。
根据文件arcTo():
将指定的圆弧作为新轮廓附加到路径。如果路径的起点与路径当前的最后一个点不同,则会添加自动 lineTo() 以将当前轮廓连接到圆弧的起点。但是,如果路径为空,则我们使用弧的第一个点调用 moveTo()。
所以理论上我的弧应该从那里开始,也就是线条结束的地方,所以如果我画一条线(矩形的左侧):
float curve = (float) (0.1 * height);
path.moveTo(0,0);
path.lineTo(0, height - curve); …Run Code Online (Sandbox Code Playgroud) 在我的一个项目中,我尝试创建带有标题和一些自定义验证的自定义 EditText。当我通过屏幕旋转和活动娱乐来测试此自定义视图时,我遇到了一个奇怪的问题。
当应用程序启动时,所有编辑文本都具有从活动静态设置的正确值。如下图所示:
当我旋转屏幕或重新创建活动后,EditText 的值将变得混乱。CustomEditText 值设置为 XML 中上次编辑文本的值。简单(基本 Android EditText)编辑文本值正常设置。
我从出现此问题的项目中复制了代码。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
first_custom_edit_text.header = "First header"
first_custom_edit_text.setText("First text")
third_custom_edit_text.header = "Third header"
third_custom_edit_text.setText("Third text")
first_simple_edit_text.setText("First simple - Not affected")
second_custom_edit_text.header = "Second header"
second_custom_edit_text.setText("Second text")
second_simple_edit_text.setText("Second simple - Not affected")
}
}
Run Code Online (Sandbox Code Playgroud)
class CustomEditText : LinearLayout {
fun setText(value: String?){
this.input_edit_text.text = Editable.Factory.getInstance().newEditable(value ?: "")
}
fun getText(): String {
return this.input_edit_text.text.toString() …Run Code Online (Sandbox Code Playgroud) I\xc2\xb4m 尝试从样式中读取属性TextAppearance,因此我可以将这些值应用于重要的组件(TextPaint例如)\n理想情况下,I\xc2\xb4d 喜欢接收引用 TextAppearance 的样式 id 并读取文本颜色等值,字体等
我注意到这R.styleable.TextAppearance是内部的,因此无法访问,以及TextAppearanceAttributes类。
这个想法还有其他选择吗?
\n\n谢谢!
\n我是初学者。这几天开始学习自定义视图,过程中几乎没有出现什么问题。
\n当我去Google解决这个问题的时候,有人提出了解决方案,但是都没有成功。我使用 Kotlin 编写的自定义视图。
\n这是我的自定义视图类,名称是MyView.kt
\npackage com.example.demos\n\nimport android.R\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.RectF\nimport android.util.AttributeSet\nimport android.view.View\nimport kotlin.math.min\n\n\nclass MyView : View {\n // init\n private lateinit var arcPaint: Paint\n private lateinit var progressTextPaint: Paint\n// private lateinit var arcPaintColor: Color\n private var arcPaintColor = Color.BLACK\n// private lateinit var progressTextPaintColor: Color\n private var progressTextPaintColor = Color.BLACK\n private var angle = 0f\n private var progress: Float = angle / 3.6f\n\n\n // get/set\n fun setArcPaintColor(color: Int) {\n arcPaintColor = color\n }\n\n fun …Run Code Online (Sandbox Code Playgroud) android ×10
android-view ×10
kotlin ×2
animation ×1
custom-view ×1
overriding ×1
parcelable ×1
textview ×1