У меня есть собственный класс (сенсорная кнопка), расширяющий класс TextView.У меня проблемы с изменением размера кнопки вручную.Я могу заставить кнопку работать только для одного типа макета или контейнера, но не для обоих.В основном Touchbutton находится в виде сетки, поэтому мой метод для изменения размера таков:
private void setLayout(buttonsize_t size) {
log("Setting Layout: "+buttonsize_t.getPxl(size));
final float scale = getContext().getResources().getDisplayMetrics().density;
int dim = (int) (buttonsize_t.getPxl(size) * scale + 0.5f);
AbsListView.LayoutParams params = (AbsListView.LayoutParams) getLayoutParams();
if (params != null) {
params.height = dim;
params.width = dim;
}
else {
params = new AbsListView.LayoutParams(dim,dim);
}
setLayoutParams(params);
}
Однако, когда TouchButton изменяется в LinearLayout (например), я получаю сбой с Logcat:
09-01 19:18:35.630: ERROR/AndroidRuntime(20793): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
09-01 19:18:35.630: ERROR/AndroidRuntime(20793): at com.ians.aac3.TouchButton.setLayout(TouchButton.java:204)
Строка 204 относится к созданию параметров.
Я заметил, что и GridView
, и LinearLayout
имеют общий родительский элемент ViewGroup
, поэтому я попытался использовать ViewGroup.LayoutParams
,Это, однако, приведет к тому же поведению для gridviews (logcat со ссылкой на ту же строку).
Кто-нибудь знает, как я мог бы сделать эту работу для любого типа макета или виджета?
ОБНОВЛЕНИЕ: Как рекомендовано, я попытался снова с View group:
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
.....
ViewGroup.LayoutParams params = getLayoutParams();
if (params != null) {
params.height = dim;
params.width = dim;
}
else {
params = new LayoutParams(dim,dim);
}
setLayoutParams(params);
или без попытки перезапустить текущий макетпараметры:
setLayoutParams(new ViewGroup.LayoutParams(dim, dim));
И я получаю такую же ошибку:
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.widget.GridView.onMeasure(GridView.java:1028)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.view.View.measure(View.java:10828)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.widget.FrameLayout.onMeasure(FrameLayout.java:267)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.view.View.measure(View.java:10828)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4351)
09-02 09:10:49.680: ERROR/AndroidRuntime(7069): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1284)
Обновление 2: кажется, что использование ViewGroup.LayoutParams, указанное выше, работает для LinearLayout.Однако, как видно выше, gridview не нравится ...