我已经实现了新样式的可折叠工具栏。我使用与示例 (Cheesesquare) 演示应用程序相同的代码——当然它在所有设备上都可以正常工作。我需要帮助来弄清楚我所做的与示例不同的地方(这样我的应用程序就不会崩溃)。
我的应用程序在 5.0+ 设备上运行良好,但在旧设备 (OS 4.4.4) 上崩溃并出现我无法隔离到我的代码的错误(堆栈中没有对我的项目类的引用)。 我觉得这很奇怪,因为这是设备特定的(如果这是代码错误,它会到处崩溃)
我有(尝试过,但没有帮助):
我看到一个相关的错误已打开(但未分配):https://code.google.com/p/android/issues/detail?id=157919 有趣的是,这个 bug 表明它不会在 4.3 上崩溃,但我手边没有那个设备。
关于如何调试崩溃原因的建议?:
E/AndroidRuntime( 708): java.lang.IllegalArgumentException: radius must be > 0
E/AndroidRuntime( 708): at android.graphics.RadialGradient.<init>(RadialGradient.java:53)
E/AndroidRuntime( 708): at android.support.v7.widget.RoundRectDrawableWithShadow.buildShadowCorners(RoundRectDrawableWithShadow.java:285)
E/AndroidRuntime( 708): at android.support.v7.widget.RoundRectDrawableWithShadow.buildComponents(RoundRectDrawableWithShadow.java:307)
E/AndroidRuntime( 708): at android.support.v7.widget.RoundRectDrawableWithShadow.draw(RoundRectDrawableWithShadow.java:209)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15493)
E/AndroidRuntime( 708): at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15511)
E/AndroidRuntime( 708): at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime( 708): at android.support.v4.widget.NestedScrollView.draw(NestedScrollView.java:1679)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1040)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15511)
E/AndroidRuntime( 708): at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15222)
E/AndroidRuntime( 708): at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime( 708): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime( 708): at android.view.View.draw(View.java:15511)
E/AndroidRuntime( 708): at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime( 708): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2623)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime( 708): at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime( 708): at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1597)
E/AndroidRuntime( 708): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1469)
E/AndroidRuntime( 708): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
E/AndroidRuntime( 708): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2666)
E/AndroidRuntime( 708): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2234)
E/AndroidRuntime( 708): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1267)
E/AndroidRuntime( 708): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6638)
E/AndroidRuntime( 708): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
E/AndroidRuntime( 708): at android.view.Choreogra
我的 Activity :
public class PaymentActivity extends AppCompatActivity {
public static final String XTRA_DEVICENAME = "";
private static String deviceName;
private ItemDto deviceDto;
private Activity mActivity;
private OkHttpClient okclient;
//Views
private RelativeLayout infoLayout;
private TextView deviceOwner;
private TextView devicePrice;
private TextView deviceInfo;
private TextView payDurationTitle;
private TextView payPriceTitle;
private TextView payDurationText;
private TextView payPriceText;
private Button upBtn;
private Button downBtn;
private TextView incText;
private View incrDivider;
private FloatingActionButton fab;
private ProgressBar devInfoProgress;
private LinearLayout incrBtnView;
private int mIterVal = 1;
private Constants.ColorInfo colorTheme = Constants.ColorInfo.GREY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
Intent intent = getIntent();
deviceName = intent.getStringExtra(XTRA_DEVICENAME);
setTheme(ColorUtil.getThemeForDevice(deviceName));
colorTheme = ColorUtil.getColorTheme(deviceName);
setContentView(R.layout.act_payment);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
okclient = new OkHttpClient();
CollapsingToolbarLayout collapsingToolbar =
(CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingToolbar.setTitle(deviceName.toUpperCase());
okclient = new OkHttpClient();
final ImageView imageView = (ImageView) findViewById(R.id.backdrop);
// todo get better default image
final String paymentIconUrl = "http://xxx/" + deviceName + "_lg.png";
Glide.with(mActivity)
.load(paymentIconUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.ic_logo_allwhite)
.error(R.drawable.ic_logo_allwhite)
.into(imageView);
setupViews();
new GetItemInfoTask().execute(deviceName);
}
private void setupViews() {
infoLayout = (RelativeLayout) findViewById(R.id.device_info_layout);
infoLayout.setBackgroundColor(getResources().getColor(ColorUtil.getDeviceColor(deviceName, ColorUtil.COLOR_SECONDARY)));
incrBtnView = (LinearLayout) findViewById(R.id.incr_btn_view);
deviceOwner = (TextView) findViewById(R.id.info_owner);
devicePrice = (TextView) findViewById(R.id.info_price);
deviceInfo = (TextView) findViewById(R.id.info_max_amount);
payDurationTitle = (TextView) findViewById(R.id.paidDurationTitle);
payPriceTitle = (TextView) findViewById(R.id.paidAmountTitle);
payDurationText = (TextView) findViewById(R.id.paidDurationText);
payPriceText = (TextView) findViewById(R.id.paidAmountText);
devInfoProgress = (ProgressBar) findViewById(R.id.devinfo_progress);
devInfoProgress.getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.card_white), android.graphics.PorterDuff.Mode.MULTIPLY);
Drawable tmpDrawable = ColorUtil.getTintedDrawable(mActivity, R.drawable.ic_attach_money, colorTheme.getSecondary());
payPriceTitle.setCompoundDrawablesWithIntrinsicBounds(tmpDrawable, null, null, null);
Drawable tmpDrawable2 = ColorUtil.getTintedDrawable(mActivity, R.drawable.ic_clock, colorTheme.getSecondary());
payDurationTitle.setCompoundDrawablesWithIntrinsicBounds(tmpDrawable2, null, null, null);
upBtn = (Button) findViewById(R.id.pay_inc_up_btn);
downBtn = (Button) findViewById(R.id.pay_inc_down_btn);
incText = (TextView) findViewById(R.id.pay_inc_text);
incrDivider = (View) findViewById(R.id.iter_divider);
upBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
...
}
});
downBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
...
}
});
upBtn.setBackground(mActivity.getResources().getDrawable(colorTheme.getSelectorId()));
downBtn.setBackground(mActivity.getResources().getDrawable(colorTheme.getSelectorId()));
fab = (FloatingActionButton) findViewById((R.id.pay_fab_btn));
//TODO - manually coloring FAB, should do with color state list
fab.setEnabled(false);
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.grey_300)));
fab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.card_white)));
...
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_payment, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private class GetItemInfoTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
...
return null;
}
@Override
protected void onPostExecute(String result) {
...
}
@Override
protected void onPreExecute() {
devInfoProgress.setVisibility(View.VISIBLE);
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
}
我的 Layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="@dimen/payments_backdrop_height"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:transitionName="device_img"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_200"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/device_info_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/info_owner"
style="@style/DeviceInfo" />
<TextView
android:id="@+id/info_price"
style="@style/DeviceInfo"
android:layout_below="@+id/info_owner"/>
<TextView
android:id="@+id/info_max_amount"
style="@style/DeviceInfo"
android:layout_below="@+id/info_price"
android:layout_marginBottom="@dimen/grid1" />
<ProgressBar
android:id="@+id/devinfo_progress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="@dimen/rythm48"
android:layout_height="@dimen/rythm48"
android:layout_toRightOf="@+id/info_price"
android:layout_marginRight="@dimen/grid5"
android:layout_marginTop="@dimen/grid1"
android:visibility="gone" />
</RelativeLayout>
<android.support.v7.widget.CardView
android:id="@+id/device_info_card"
style="@style/CardView"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="6dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/launch_title"
style="@style/CardTitle"
android:text="Current Amounts" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/confirm_text"
android:layout_marginBottom="@dimen/grid5"
android:orientation="horizontal"
android:weightSum="2">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/paidAmountTitle"
style="@style/TextAppearance.AppCompat.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_dollar"
android:gravity="center"
android:text="@string/paid_amount_title" />
<TextView
android:id="@+id/paidAmountText"
style="@style/TextAppearance.AppCompat.Headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/paidDurationTitle"
style="@style/TextAppearance.AppCompat.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_clock"
android:gravity="center"
android:text="@string/paid_duration_title" />
<TextView
android:id="@+id/paidDurationText"
style="@style/TextAppearance.AppCompat.Headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/iter_divider"
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_marginBottom="@dimen/grid2"
android:layout_marginTop="@dimen/grid_5"
android:background="@color/grey_400"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/incr_btn_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/grid5"
android:layout_marginLeft="@dimen/grid4"
android:layout_marginRight="@dimen/grid4"
android:orientation="horizontal"
android:gravity="center"
android:weightSum="3"
android:visibility="gone">
<Button
android:id="@+id/pay_inc_down_btn"
style="@style/InfoButton"
android:layout_width="@dimen/rythm48"
android:layout_height="@dimen/rythm48"
android:text="-"
android:textSize="32sp"
android:layout_weight="1"/>
<TextView
android:id="@+id/pay_inc_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:gravity="center"
android:layout_marginRight="@dimen/grid2"
android:layout_marginLeft="@dimen/grid2"
android:textSize="24sp"
android:layout_weight="1"/>
<Button
android:id="@+id/pay_inc_up_btn"
style="@style/InfoButton"
android:layout_width="@dimen/rythm48"
android:layout_height="@dimen/rythm48"
android:text="+"
android:textSize="32sp"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/provider_card_view"
style="@style/CardView"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="6dp">
<fragment
android:id="@+id/provider_fragment"
android:name="com.cleartoken.pay.ui.frag.ProviderFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
style="@style/CardView"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="6dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Info"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/long_text" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/pay_fab_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/grid2"
android:clickable="true"
android:src="@drawable/ic_fab_enabled"
app:borderWidth="0dp"
app:layout_anchor="@id/device_info_card"
app:layout_anchorGravity="bottom|right|end" />
</android.support.design.widget.CoordinatorLayout>
CardView style.xml fragment :
<style name="CardView">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_margin">@dimen/grid1</item>
</style>
注意:
我普遍使用相同的卡片样式。在 Act#1 这有效*(最大的不同在于 Act#1 没有协调器布局)。
我的卡片 XML 普遍看起来像这样:
<android.support.v7.widget.CardView
android:id="@+id/device_info_card"
style="@style/CardView"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="6dp">
最佳答案
在您的堆栈错误中,有一件事让我印象深刻。似乎在 4.4 及以下版本中,您的应用正在尝试绘制大于实际手机宽度的图形用户界面。 RadialGradient 错误对我来说没有意义,因为它应该大于屏幕尺寸而不是小于零。
/** Create a shader that draws a radial gradient given the center and radius.
@param centerX The x-coordinate of the center of the radius
@param centerY The y-coordinate of the center of the radius
@param radius Must be positive. The radius of the circle for this gradient.
@param colors The colors to be distributed between the center and edge of the circle
@param stops May be <code>null</code>. Valid values are between <code>0.0f</code> and
<code>1.0f</code>. The relative position of each corresponding color in
the colors array. If <code>null</code>, colors are distributed evenly
between the center and edge of the circle.
@param tileMode The Shader tiling mode
*/
public RadialGradient(float centerX, float centerY, float radius,
@NonNull int colors[], @Nullable float stops[], @NonNull TileMode tileMode) {
if (radius <= 0) {
throw new IllegalArgumentException("radius must be > 0");
}
if (colors.length < 2) {
throw new IllegalArgumentException("needs >= 2 number of colors");
}
if (stops != null && colors.length != stops.length) {
throw new IllegalArgumentException("color and position arrays must be of equal length");
}
mType = TYPE_COLORS_AND_POSITIONS;
mX = centerX;
mY = centerY;
mRadius = radius;
mColors = colors;
mPositions = stops;
mTileMode = tileMode;
init(nativeCreate1(centerX, centerY, radius, colors, stops, tileMode.nativeInt));
}
那是 radialgradient 类的一个 fragment 。如果可以的话,强制代码运行的一种方法是简单地编辑 radialgradient 类(Android Studio 有一种方法可以这样做)。
我对这个问题的解决方案是首先检查您的 xml 文件并开始删除不常见/没有意义的代码行。喜欢:
android:fitsSystemWindows="true"
fitSystemWindow Multiple Calls
您还应该避免的另一件事是线性布局的 weightsum 和 weight 标签。并尝试将您的父小部件设为 RelativeLayout。
编辑:
思考了一会儿(仅 2 分钟)后,我意识到错误可能只是由于 styles.xml 实现所致。您确定复制了您在 git 存储库中看到的所有文件夹吗?
有时出现此错误,通常是因为 values-v21 文件夹未添加适当的 styles.xml。
因此,如果您没有 values-v21 文件夹,请执行以下操作: - 在res文件夹下创建一个values-v21文件夹。 -然后在values-v21文件夹下新建一个styles.xml文件夹,添加这段代码。
<resources>
<style name="Theme.DesignDemo" parent="Base.Theme.DesignDemo">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
关于android - CollapsingToolbarLayout 在 4.4 设备上崩溃 (java.lang.IllegalArgumentException : radius must be > 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171845/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候