我有子(不作为root)元素RelativeLayout的布局,然后我创建ViewPager并将其作为我的相对布局的子项插入,所以它就像
+相对布局(根)
|
+ - 相对布局(儿童)
|
+ - - ViewPager
现在一刻 - 一切都好.
但后来我尝试使用自己的布局向ViewPager添加一些视图项,然后我收到错误
10-12 15:32:46.777: E/AndroidRuntime(6031): FATAL EXCEPTION: main
10-12 15:32:46.777: E/AndroidRuntime(6031): java.lang.StackOverflowError
10-12 15:32:46.777: E/AndroidRuntime(6031): at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5035)
Run Code Online (Sandbox Code Playgroud)
那个ViewPager如何让我成为具有自己的儿童观点的RelativeLayout的孩子?
我正在为Android开发游戏.为了帮助实现它,我的想法是创建一个视图的子类.然后我会插入此类的几个实例作为主视图的子项.每个实例都会处理它被按下的时间(通过OnTouchListener).
我现在遇到的问题是如何遍历所有这些子视图,以便我可以读取它们的状态并处理它们?(即当他们都达到某种状态时应该发生的事情).
或者,是否有更好的方法可以在屏幕上显示多个响应触摸的对象以及我可以检查其状态?
我见过一些人问过如何一次性缩放整个ViewGroup(例如RelativeLayout).目前,这是我需要实现的目标.对我来说,最明显的方法是将缩放比例因子保持为某个变量; 并且在每个子视图的onDraw()方法中,该比例因子将在绘制图形之前应用于Canvas.
然而,在这之前,我试图聪明(哈 - 通常是一个坏主意)并将RelativeLayout扩展到一个名为ZoomableRelativeLayout的类中.我的想法是,任何比例转换只能在重写的dispatchDraw()函数中应用于Canvas,因此绝对不需要在任何子视图中单独应用缩放.
这是我在ZoomableRelativeLayout中所做的.它只是RelativeLayout的一个简单扩展,其中dispatchDraw()被覆盖:
protected void dispatchDraw(Canvas canvas){
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.scale(mScaleFactor, mScaleFactor);
super.dispatchDraw(canvas);
canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)
mScaleFactor由同一类中的ScaleListener操作.
它确实有效.我可以捏缩放ZoomableRelativeLayout,并将所有视图保持在一起正确重新缩放.
除了有问题.其中一些子视图是动画的,因此我会定期对它们调用invalidate().当比例为1时,可以看到这些子视图定期重绘完全正常.当比例不是1时,这些动画子视图只能在其观看区域的一部分中更新 - 或者根本不会更新 - 具体取决于缩放比例.
我最初的想法是,当一个人子视图的无效()被调用,那么它可能被单独由系统重新绘制,而不是传递从父的RelativeLayout的dispatchDraw()画布,这意味着子视图最终刷新自己没有应用缩放比例.但奇怪的是,在屏幕上重绘的子视图的元素是正确的缩放比例.这几乎就好像系统决定在后备位图中实际更新的区域仍然未缩放 - 如果这有意义的话.换一种方式,如果我有一个动画儿童观和我逐渐成为1的初始规模进一步和进一步放大,如果我们把一个假想的地方发现孩子的看法是该区域时,缩放比例为1 ,然后调用invalidate()只会导致刷新该虚构框中的图形.但是,这被视为更新显卡都正在做正确的规模.如果放大到目前为止,子视图现在已经完全远离它的比例为1,那么它的任何部分都不会被刷新.我将举一个例子:想象我的孩子视图是一个通过在黄色和红色之间切换来动画的球.如果我放大一点使得球向右和向下移动,在某一点你只会看到球的左上角四分之一的颜色.
如果我不断放大和缩小,我会看到孩子正确完整地观看动画.这是因为正在重绘整个ViewGroup.
我希望这是有道理的; 我试图尽我所能解释.使用我的可缩放ViewGroup策略,我有点失败吗?还有另外一种方法吗?
谢谢,
崔佛
android android-layout android-relativelayout android-viewgroup
我试图通过这种方式以编程方式设置工具栏的高度:
toolbar.setLayoutParams(new Toolbar.LayoutParams(LayoutParams.MATCH_PARENT, 42));
toolbar.setMinimumHeight(42);
Run Code Online (Sandbox Code Playgroud)
但是这个日志会导致致命的异常 - > android.widget.relativelayout$layoutparams cannot be cast to android.support.v7.Toolbar$layoutparams
我也尝试这个变种:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toolbar.getLayoutParams();
params.height = 42;
toolbar.setLayoutParams(params);
toolbar.setMinimumHeight(42);
Run Code Online (Sandbox Code Playgroud)
它没有给出异常,但它也不起作用,工具栏得到它的默认更大的高度而不是我定义的.但当然要设置参数xml工作中,但我也需要在java中设置高度.
所以请帮我解决问题.
android android-layout android-xml android-viewgroup android-toolbar
我有一个徽标视图,这是一个包含单个的全屏片段ImageView.在徽标图像完全可见后,我必须执行一些操作.
以下代码用于调用特殊任务
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ImageView logoImageMaster = new ImageView(getContext());
//logoImageMaster.setImageResource(resID); //even after removing this, i am getting the callback twice
try {
// get input stream
InputStream ims = getActivity().getAssets().open("product_logo.png");
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
logoImageMaster.setImageDrawable(d);
}
catch(IOException ex) {
}
logoImageMaster.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() { //FIXME get called twice. Check this out, no info to distinguish …Run Code Online (Sandbox Code Playgroud) 我在崩溃日志中从我的一个app用户那里得到了以下异常.无法从日志跟踪中了解.如果有人有想法,请分享.
致命异常:java.lang.IllegalArgumentException参数必须是此视图 raw 的后代
android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:4563)android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:4500)android.view.ViewGroup $ ViewLocationHolder.init(ViewGroup.java:6738)android.view.ViewGroup $ ViewLocationHolder.obtain(ViewGroup.java:6675)android.view.ViewGroup $ ChildListForAccessibility.init(ViewGroup.java:6633)android.view.ViewGroup $ ChildListForAccessibility.obtain(ViewGroup.java:6601)android.view.ViewGroup.addChildrenForAccessibility( ViewGroup.java:1703)android.view.ViewGroup.onInitializeAccessibilityNodeInfoInternal(ViewGroup.java:2530)android.view.View.onInitializeAccessibilityNodeInfo(View.java:5209)android.widget.AdapterView.onInitializeAccessibilityNodeInfo(AdapterView.java:937)android. widget.AbsListView.onInitializeAccessibilityNodeInfo(AbsListView.java:1492)android.widget.ListView.onInitializeAccessibilityNodeInfo(ListView.java:3781)android.view.View.createAccessibilityNodeInfoInternal(View.java:5170)andro id.view.View.createAccessibilityNodeInfo(View.java:5157)
我正在尝试以编程方式(不使用XML文件)在Android中创建自定义子视图(这就是我在iOS中所称的),它基本上是一些基本视图(标签,按钮,文本字段等)放在一个可重用的子视图中所以我可以在我UIViewControllers或ActivityAndroid中使用它.
我不知道Android中的正确术语是什么.似乎有一百万种不同的术语.
自定义视图,ViewGroups,布局,窗口小部件,组件,无论您想要调用它.
在iOS中,这样做就像这样:
@interface CustomView : UIView
@property (nonatomic, strong) UILabel *message;
@property (nonatomic, strong) UIButton *button;
@end
Run Code Online (Sandbox Code Playgroud)
@implementation CustomView
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
[self initViews];
[self initConstraints];
}
return self;
}
-(void)initViews
{
self.message = [[UILabel alloc] init];
self.button = [[UIButton alloc] init];
[self addSubview:self.message];
[self addSubview:self.button];
}
-(void)initConstraints
{
id views = @{
@"message": self.message,
@"button": self.button
};
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[message]|" options:0 metrics:nil views:views]];
[self …Run Code Online (Sandbox Code Playgroud) FrameLayout在Android中有什么用途?是否有针对其设计的特定方案?
在我的Android应用程序中,我有一个场景,我必须显示两个ImageView,一个在另一个.这是一个.png图像文件,在此图像上可以绘制9个补丁.
ViewGroup我应该为此目的使用哪个:RelativeLayout或FrameLayout?
我还想知道ViewGroup应该使用每个s 的不同场景.
android android-relativelayout android-viewgroup android-framelayout
当视图结束后拉出视图时,这个蓝色阴影叫什么?当出现或出现时是否有触发器?

我已经实现了https://github.com/maurycyw/StaggeredGridView,我希望在此视图组被过度滚动时加载更多项目.
我正在开发一款Android应用.在我的应用程序中,我需要动态地扩展视图列表.我加了他们并且正在工作.问题是设置布局的宽度和高度.现在我将通过一个简单的项目来演示我的问题.实际上,我的项目比这个简单的项目复杂得多.
我正在夸大这种布局的观点.
<LinearLayout
android:orientation="horizontal"
android:id="@+id/cm_photos_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我循环遍历位图列表并动态添加视图,如下所示
for(Bitmap bmp : bitmaps)
{
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
container.addView(preview);
}
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的代码中,container是一个LinearLayout动态添加到上面的父XML中.
container = new LinearLayout(this);
container.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
container.setLayoutParams(params);
parentLinearLayout.addView(container);
Run Code Online (Sandbox Code Playgroud)
这是我的item_cm_preview_image.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_weight="1"
android:layout_height="400dp"
android:layout_width="0dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:scaleType="centerCrop"
android:id="@+id/item_cm_preview_image"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
如您所见,我在XML中将布局高度设置为400dp,宽度0和layout_weight为1.因此,由于layout_weight,所有图像高度必须相同且宽度必须相等.但结果并不像预期的那样.你可以在下面看到截图.
正如您在屏幕截图中看到的那样,layout_weight和height都不适用于所有膨胀的视图.但是,如果我动态添加额外的ViewGroup并将视图扩展到该布局,它就可以了.以下是我的代码
//This happening in for loop
LinearLayout wrapper = new LinearLayout(this);
wrapper.setLayoutParams(new LinearLayout.LayoutParams(0,500,1));
View preview = layoutInflater.inflate(R.layout.item_cm_preview_image,null);
ImageView previewImageView = (ImageView)preview.findViewById(R.id.item_cm_preview_image);
previewImageView.setImageBitmap(bmp);
wrapper.addView(preview);
container.addView(wrapper); …Run Code Online (Sandbox Code Playgroud) android android-layout layout-inflater android-view android-viewgroup