我经常在布局文件中看到工具栏的这个声明:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)
为什么有两个与主题相关的属性:主题和弹出主题?
每个人的目的是什么?
android android-appcompat android-support-library android-toolbar
我经常使用ViewPropertyAnimator并使用withEndAction()函数设置结束动作,如:
view.animate().translationY(0).withEndAction(new Runnable() {
@Override
public void run() {
// do something
}
}).start();
Run Code Online (Sandbox Code Playgroud)
但您也可以设置结束动作设置特殊监听器,如:
view.animate().translationY(0).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// do something
}
});
Run Code Online (Sandbox Code Playgroud)
那么这两种方法之间有什么区别,何时应该使用它们?
在我的项目中,我有一个WebView加载页面(HTML).我希望在用户点击任何图像时更改所有图像并显示祝酒词.
所以我添加了调用Java函数的javascript代码:
// code is inside onPageFinished(..) function
JavaScriptInterface jsInterface = new JavaScriptInterface(activity);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");
webView.evaluateJavascript(
"var imgs = document.getElementsByTagName('img');" +
"for (var i = 0; i < imgs.length; i++) {" +
"imgs[i].src = 'file:///android_asset/rules_images_placeholder.png';" +
"imgs[i].addEventListener('click', function() {" +
"window.JSInterface.showToast(); " + // <-- isn't called: see logs
"});" +
"} " +
"window.JSInterface.showToast();" // <-- is called
, null);
Run Code Online (Sandbox Code Playgroud)
JavaScriptInterface类:
public class JavaScriptInterface {
private Activity activity;
public JavaScriptInterface(Activity activity) {
this.activity = activity;
} …Run Code Online (Sandbox Code Playgroud) 我遵循Android推荐并设置style="?android:attr/buttonBarStyle" 为父布局和style="?android:attr/buttonBarButtonStyle"按钮.
所以现在我的布局是这样的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
style="?android:attr/buttonBarStyle">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 1"
style="?android:attr/buttonBarButtonStyle"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 2"
style="?android:attr/buttonBarButtonStyle"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 3"
style="?android:attr/buttonBarButtonStyle"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
但是在设置了样式后,这些按钮变得不可见,但我仍然可以点击它们.
请告诉我有什么问题.
编辑:其他细节
好吧,我刚刚创建了一个专门用于测试此布局的新项目,并且令人惊讶的是它确实可行.
所以更准确地说,实际上,我动态地将这个布局添加到另一个布局,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/buttons_panel_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
<!-- some other stuff -->
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
码:
LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout buttonsPanelContainer = (LinearLayout) findViewById(R.id.buttons_panel_container);
View buttonPanelView = null;
if(chosenValueType.equals("some_type")) {
buttonPanelView = layoutInflater.inflate(R.layout.some_buttons_panel, null);
Button Button1 …Run Code Online (Sandbox Code Playgroud) 我需要我的EditText组件在文本到达行尾时将文本移动到下一行.
有没有人知道如何防止EditText在填充文本时垂直扩展?而是EditText应垂直滚动.有没有办法在不修复EditText大小的情况下完成它?
我在网上搜索了相关信息,但没有找到答案.
大多数内置小部件在配置更改时恢复其状态.
但是现在我想要禁用此功能.
我在onCreate()调用期间将特定视图设置为某个值,并且如果设备已旋转,则在onRestoreInstanceState()期间更改它.
我可以在onRestoreInstanceState()之后重置它,但也许有另一种方法可以做到这一点.