Я много исследовал, чтобы настроить макет, когда softkeyboard активен, и я успешно реализовал его, но проблема возникает, когда я использую android: theme = «@ android: style/Theme.NoStartBar.Fullscreen»
это в моей деятельности тэг в файле манифеста.
Для этого я использовал android: windowSoftInputMode = «adjustPan 'adjustResize' stateHidden»
с различными опциями, но без удачи.
После этого я реализовал FireScreen
программно и попробовал различные макеты для работы с FureScreen
, но все это напрасно.
Я сослался на эти ссылки и посмотрел здесь много сообщений, связанных с этой проблемой:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Вот xml-код:
Я хочу, чтобы нижние 2 кнопки должны идти вверх, когда мягкая клавиатура будет изображена.
-121--587456-
Я являюсь ведущим автором ORMLite , который использует аннотации Java на классах для построения схем базы данных. Большой проблемой производительности стартапа для нашего пакета оказывается вызов методов аннотации под Android 1.6. Я вижу такое же поведение вплоть до 3.0.
Мы видим, что следующий простой код аннотации является невероятно интенсивным GC и реальной проблемой производительности. 1000 вызовов метода аннотации занимает почти секунду на быстром Android-устройстве. Тот же код, что и на моем Macbook Pro, может сделать 28 миллионов (sic) вызовов одновременно. У нас есть аннотация, которая содержит 25 методов, и мы хотели бы сделать более 50 из них в секунду.
Кто-нибудь знает, почему это происходит и есть ли вокруг какая-либо работа? Конечно, есть вещи, которые ORMLite может сделать с точки зрения кэширования этой информации, но есть ли что-то, что мы можем сделать, чтобы «исправить» аннотации под Android? Спасибо.
public void testAndroidAnnotations() throws Exception {
Field field = Foo.class.getDeclaredField("field");
MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);
long before = System.currentTimeMillis();
for (int i = 0; i < 1000; i++)
myAnnotation.foo();
Log.i("test", "in " + (System.currentTimeMillis() - before) + "ms");
}
@Target(FIELD) @Retention(RUNTIME)
private static @interface MyAnnotation {
String foo();
}
private static class Foo {
@MyAnnotation(foo = "bar")
String field;
}
Это приводит к следующим выводам журнала:
I/TestRunner( 895): started: testAndroidAnnotations
D/dalvikvm( 895): GC freed 6567 objects / 476320 bytes in 85ms
D/dalvikvm( 895): GC freed 8951 objects / 599944 bytes in 71ms
D/dalvikvm( 895): GC freed 7721 objects / 524576 bytes in 68ms
D/dalvikvm( 895): GC freed 7709 objects / 523448 bytes in 73ms
I/test ( 895): in 854ms
EDIT:
После того, как @ candrews указал меня в правильном направлении, я сделал некоторые тычки вокруг кода. Проблема с производительностью может быть вызвана ужасным общим кодом в Method.equals ()
. Он вызывает toString ()
обоих методов, а затем сравнивает их. Каждый toString ()
использует StringBuilder
с набором методов добавления без хорошего размера инициализации. Выполняется .равно
при сравнении полей будет значительно быстрее.
ПРАВКА:
Мне было дано интересное улучшение производительности рефлексии. Теперь мы используем отражение, чтобы заглянуть в класс AnnotationFactory
для непосредственного чтения списка полей. Это делает класс отражения 20 в для нас быстрее, поскольку он обходит вызов, который использует метод method.equals ()
. Это не универсальное решение, а код Java из репозитория ORMLite SVN . Общее решение см. в ответе янченко ниже .