Установить высоту панели SlidingUpPanelLayout программно
Я реализовал SlidingUpPanelLayout в моем приложении, и он работает нормально. Теперь я хочу динамически устанавливатьвысоту панели, как только моя активность уже создана, я делаю это в своем XML, как это
<com.sothree.slidinguppanel.SlidingUpPanelLayout
xmlns:sothree="http://schemas.android.com/apk/res-auto"
android:id="@+id/sliding_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
sothree:umanoPanelHeight="68dp"
sothree:umanoShadowHeight="4dp"
sothree:umanoParalaxOffset="100dp"
sothree:umanoDragView="@+id/dragView"
sothree:umanoOverlay="true">
<!-- MAIN CONTENT -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Main Content"
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="true"
android:textSize="16sp" />
</FrameLayout>
<!-- SLIDING LAYOUT -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical"
android:clickable="true"
android:focusable="false"
android:id="@+id/dragView">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="68dp"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="14sp"
android:gravity="center_vertical"
android:paddingLeft="10dp"/>
<Button
android:id="@+id/follow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="14sp"
android:gravity="center_vertical|right"
android:paddingRight="10dp"
android:paddingLeft="10dp"/>
</LinearLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="fitStart"
android:src="@drawable/graphic" >
</ImageView>
</LinearLayout>
</com.sothree.slidinguppanel.SlidingUpPanelLayout>
Это работает нормально, но я хочу установить в кодеonCreate
mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
mLayout.setPanelSlideListener(new PanelSlideListener() {
@Override
public void onPanelSlide(View panel, float slideOffset) {
Log.i(TAG, "onPanelSlide, offset " + slideOffset);
}
@Override
public void onPanelExpanded(View panel) {
Log.i(TAG, "onPanelExpanded");
}
@Override
public void onPanelCollapsed(View panel) {
Log.i(TAG, "onPanelCollapsed");
}
@Override
public void onPanelAnchored(View panel) {
Log.i(TAG, "onPanelAnchored");
}
@Override
public void onPanelHidden(View panel) {
Log.i(TAG, "onPanelHidden");
}
});
mLayout.setPanelHeight(Utils.getPixels(80, getResources()));
Но при этом я получаю сбой
04-23 20:09:24.010: E/AndroidRuntime(13344): вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод int android.view.View.getLeft() для ссылки на пустой объект
Поскольку mSlideableView является нулевым в методе smoothSlideTo SlidingUpPanelLayout.java.
Заранее спасибо.
3 ответа
Это происходит потому, что вы не даете достаточно времени для раздувания макета. То же самое случилось со мной с той же библиотекой, и я попробовал это:
final int someWaitInterval = 20;
Runnable r = new Runnable() {
@Override
public void run() {
try {
mLayout.setPanelHeight(params.height);
} catch (Exception e2) {
new Handler().postDelayed(this, someWaitInterval);
}
}};
new Handler().postDelayed(r, someWaitInterval);
Таким образом, он будет вызывать сам себя, пока фактически не изменит высоту панели.
Попробуйте следующее:
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
mLayout.setPanelHeight(height/2);
Также ознакомьтесь с этим постом: Установка высоты программно в панели Android SlideUp