Android 膨胀视图并将其添加到水平滚动视图中的线性布局-奇怪的行为
我正在尝试创建一个类,该类可以添加到布局文件中,设置适配器,然后从DataSetObserver进行更新 在NexusOne上,这通常看起来很好,但是在G1上,我有一些奇怪的行为 因此,活动的布局文件为:Android 膨胀视图并将其添加到水平滚动视图中的线性布局-奇怪的行为,android,Android,我正在尝试创建一个类,该类可以添加到布局文件中,设置适配器,然后从DataSetObserver进行更新 在NexusOne上,这通常看起来很好,但是在G1上,我有一些奇怪的行为 因此,活动的布局文件为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vert
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/ActionBarInclude"
layout="@layout/action_bar"></include>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:background="@drawable/action_bar_drop_shadow">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent" android:gravity="center"
android:id="@+id/AccountSummaryAppTitleTextView" android:text=""
style="@style/titleTextView"></TextView>
<co.uk.gauntface.android.admob.views.TabBarScrollView
android:id="@+id/AccountSummaryTabBarScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:scrollbars="none">
</co.uk.gauntface.android.admob.views.TabBarScrollView>
<co.uk.gauntface.android.admob.views.SlidingLayout android:layout_width="fill_parent"
android:id="@+id/AccountSummarySlidingLayout" android:layout_weight="1"
android:layout_height="wrap_content" android:scrollbars="none" android:fadingEdge="none"
android:fillViewport="true">
</co.uk.gauntface.android.admob.views.SlidingLayout>
</LinearLayout>
</LinearLayout>
package co.uk.gauntface.android.admob;
import java.util.ArrayList;
import co.uk.gauntface.android.admob.models.RawSite;
import co.uk.gauntface.android.admob.models.SiteStat;
import co.uk.gauntface.android.admob.networking.AdmobDownloadListener;
import co.uk.gauntface.android.admob.networking.SiteStatService;
import co.uk.gauntface.android.admob.views.AccountSummaryAdapter;
import co.uk.gauntface.android.admob.views.SlidingLayout;
import co.uk.gauntface.android.admob.views.TabBarScrollView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class AccountSummary extends AdmobActivity
{
private final static String TAG = "admob";
public static final String ACCOUNT_SUMMARY_INTENT_EXTRA_ID = "AccountSummaryIntentExtraID";
private String mAccountID;
private RawSite mRawSiteData;
private Handler mHandler;
private SiteStatService mSiteStatService;
private ArrayList<SiteStat> mSiteStatData;
private ActionBarHelper mActionBarHelper;
private TextView mAppTitleTextView;
private TabBarScrollView mTabBarScrollView;
private SlidingLayout mSlidingLayout;
private AccountSummaryAdapter mAdapter;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.account_summary);
mAccountID = getIntent().getExtras().getString(ACCOUNT_SUMMARY_INTENT_EXTRA_ID);
mSiteStatService = new SiteStatService(getApplicationContext());
//mChartAdapter = new PointPositionAdapter(getApplicationContext());
initActivity();
setUpUI();
if(getLastNonConfigurationInstance() != null) {
mSiteStatData = (ArrayList<SiteStat>) getLastNonConfigurationInstance();
mAdapter.setSiteStatData(mSiteStatData);
} else {
updateSiteStatData();
}
}
/**public void onConfigurationChanged (Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.account_summary);
setUpUI();
}**/
@Override
public Object onRetainNonConfigurationInstance() {
return mSiteStatData;
}
private void initActivity() {
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.arg1) {
default:
break;
}
}
};
mAdapter = new AccountSummaryAdapter(getApplicationContext(), new Integer[]{
R.string.revenue,
R.string.ecpm,
R.string.requests,
R.string.impressions,
R.string.fill_rate,
R.string.ctr
});
DatabaseManager dbManager = new DatabaseManager(getApplicationContext());
dbManager.open();
mRawSiteData = dbManager.getSite(mAccountID);
dbManager.close();
}
private void setUpUI() {
mActionBarHelper = new ActionBarHelper(this);
mAppTitleTextView = (TextView) findViewById(R.id.AccountSummaryAppTitleTextView);
mAppTitleTextView.setText(mRawSiteData.getSiteName());
mTabBarScrollView = (TabBarScrollView) findViewById(R.id.AccountSummaryTabBarScrollView);
mTabBarScrollView.setAdapter(mAdapter.getTabBarAdapter());
mTabBarScrollView.setOnItemOnClickListener(mAdapter);
mSlidingLayout = (SlidingLayout) findViewById(R.id.AccountSummarySlidingLayout);
mSlidingLayout.setAdapter(mAdapter.getSlidingLayoutAdapter());
mSlidingLayout.setOnDisplayChangeListener(mAdapter);
}
private void updateSiteStatData() {
mActionBarHelper.incrementRequests();
int daysToGet = getResources().getInteger(R.integer.account_summary_days);
mSiteStatService.downloadDailySiteStats(daysToGet, mRawSiteData.getSiteID(), new AdmobDownloadListener() {
public void onDownloadSuccess(Object obj) {
mActionBarHelper.decrementRequests();
mSiteStatData = (ArrayList<SiteStat>) obj;
//mAdapter.setSiteStatData(mSiteStatData);
}
public void onDownloadError(int errorCode, String errorMsg) {
mActionBarHelper.decrementRequests();
displayErrorMessage(errorCode, errorMsg);
}
});
}
public void onClick(View v) {
switch(v.getId())
{
case R.id.ActionBarRefreshImageButton:
updateSiteStatData();
break;
}
}
}
我之所以将FillViewPort设置为true,是因为这里有一个类似的问题:
虽然这并没有解决我的问题
该活动的源代码为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/ActionBarInclude"
layout="@layout/action_bar"></include>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:background="@drawable/action_bar_drop_shadow">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent" android:gravity="center"
android:id="@+id/AccountSummaryAppTitleTextView" android:text=""
style="@style/titleTextView"></TextView>
<co.uk.gauntface.android.admob.views.TabBarScrollView
android:id="@+id/AccountSummaryTabBarScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:scrollbars="none">
</co.uk.gauntface.android.admob.views.TabBarScrollView>
<co.uk.gauntface.android.admob.views.SlidingLayout android:layout_width="fill_parent"
android:id="@+id/AccountSummarySlidingLayout" android:layout_weight="1"
android:layout_height="wrap_content" android:scrollbars="none" android:fadingEdge="none"
android:fillViewport="true">
</co.uk.gauntface.android.admob.views.SlidingLayout>
</LinearLayout>
</LinearLayout>
package co.uk.gauntface.android.admob;
import java.util.ArrayList;
import co.uk.gauntface.android.admob.models.RawSite;
import co.uk.gauntface.android.admob.models.SiteStat;
import co.uk.gauntface.android.admob.networking.AdmobDownloadListener;
import co.uk.gauntface.android.admob.networking.SiteStatService;
import co.uk.gauntface.android.admob.views.AccountSummaryAdapter;
import co.uk.gauntface.android.admob.views.SlidingLayout;
import co.uk.gauntface.android.admob.views.TabBarScrollView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class AccountSummary extends AdmobActivity
{
private final static String TAG = "admob";
public static final String ACCOUNT_SUMMARY_INTENT_EXTRA_ID = "AccountSummaryIntentExtraID";
private String mAccountID;
private RawSite mRawSiteData;
private Handler mHandler;
private SiteStatService mSiteStatService;
private ArrayList<SiteStat> mSiteStatData;
private ActionBarHelper mActionBarHelper;
private TextView mAppTitleTextView;
private TabBarScrollView mTabBarScrollView;
private SlidingLayout mSlidingLayout;
private AccountSummaryAdapter mAdapter;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.account_summary);
mAccountID = getIntent().getExtras().getString(ACCOUNT_SUMMARY_INTENT_EXTRA_ID);
mSiteStatService = new SiteStatService(getApplicationContext());
//mChartAdapter = new PointPositionAdapter(getApplicationContext());
initActivity();
setUpUI();
if(getLastNonConfigurationInstance() != null) {
mSiteStatData = (ArrayList<SiteStat>) getLastNonConfigurationInstance();
mAdapter.setSiteStatData(mSiteStatData);
} else {
updateSiteStatData();
}
}
/**public void onConfigurationChanged (Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.account_summary);
setUpUI();
}**/
@Override
public Object onRetainNonConfigurationInstance() {
return mSiteStatData;
}
private void initActivity() {
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.arg1) {
default:
break;
}
}
};
mAdapter = new AccountSummaryAdapter(getApplicationContext(), new Integer[]{
R.string.revenue,
R.string.ecpm,
R.string.requests,
R.string.impressions,
R.string.fill_rate,
R.string.ctr
});
DatabaseManager dbManager = new DatabaseManager(getApplicationContext());
dbManager.open();
mRawSiteData = dbManager.getSite(mAccountID);
dbManager.close();
}
private void setUpUI() {
mActionBarHelper = new ActionBarHelper(this);
mAppTitleTextView = (TextView) findViewById(R.id.AccountSummaryAppTitleTextView);
mAppTitleTextView.setText(mRawSiteData.getSiteName());
mTabBarScrollView = (TabBarScrollView) findViewById(R.id.AccountSummaryTabBarScrollView);
mTabBarScrollView.setAdapter(mAdapter.getTabBarAdapter());
mTabBarScrollView.setOnItemOnClickListener(mAdapter);
mSlidingLayout = (SlidingLayout) findViewById(R.id.AccountSummarySlidingLayout);
mSlidingLayout.setAdapter(mAdapter.getSlidingLayoutAdapter());
mSlidingLayout.setOnDisplayChangeListener(mAdapter);
}
private void updateSiteStatData() {
mActionBarHelper.incrementRequests();
int daysToGet = getResources().getInteger(R.integer.account_summary_days);
mSiteStatService.downloadDailySiteStats(daysToGet, mRawSiteData.getSiteID(), new AdmobDownloadListener() {
public void onDownloadSuccess(Object obj) {
mActionBarHelper.decrementRequests();
mSiteStatData = (ArrayList<SiteStat>) obj;
//mAdapter.setSiteStatData(mSiteStatData);
}
public void onDownloadError(int errorCode, String errorMsg) {
mActionBarHelper.decrementRequests();
displayErrorMessage(errorCode, errorMsg);
}
});
}
public void onClick(View v) {
switch(v.getId())
{
case R.id.ActionBarRefreshImageButton:
updateSiteStatData();
break;
}
}
}
package co.uk.gaunface.android.admob;
导入java.util.ArrayList;
import co.uk.gaunface.android.admob.models.RawSite;
import co.uk.gaunface.android.admob.models.SiteStat;
导入co.uk.gaunface.android.admob.networking.AdmobDownloadListener;
import co.uk.gaunface.android.admob.networking.SiteStatService;
导入co.uk.gaunface.android.admob.views.AccountSummaryAdapter;
导入co.uk.gaunface.android.admob.views.SlidingLayout;
import co.uk.gaunface.android.admob.views.TabBarScrollView;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.util.Log;
导入android.view.view;
导入android.widget.TextView;
公共类AccountSummary扩展了AdMobility
{
私有最终静态字符串TAG=“admob”;
公共静态最终字符串帐户\u摘要\u意图\u额外\u ID=“accountsummaryintententextraid”;
私有字符串mAccountID;
私有RawSite mRawSiteData;
私人经理人;
专用站点StatService MSITestService;
私有ArrayList msitestdata;
私人ActionBarHelper mActionBarHelper;
私有文本视图mAppTitleTextView;
私有选项卡滚动视图mTabBarScrollView;
私人幻灯片布局mSlidingLayout;
私人帐户摘要适配器;
/**在首次创建活动时调用*/
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.account_summary);
mAccountID=getIntent().getExtras().getString(账户\汇总\意图\额外\ ID);
msitestservice=newsitestatservice(getApplicationContext());
//mChartAdapter=newpointpositionadapter(getApplicationContext());
初始化活动();
setUpUI();
如果(getLastNonConfigurationInstance()!=null){
MSITestData=(ArrayList)getLastNonConfigurationInstance();
mAdapter.setsitestata(msitestdata);
}否则{
updateTestData();
}
}
/**公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
setContentView(R.layout.account_summary);
setUpUI();
}**/
@凌驾
公共对象OnRetainOnConfiguration实例(){
返回MSITestData;
}
私有void initActivity(){
mHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
开关(消息arg1){
违约:
打破
}
}
};
mAdapter=new AccountSummaryAdapter(getApplicationContext(),新整数[]{
R.string.revenue,
R.string.ecpm,
R.string.requests,
R.string.impressions,
R.字符串填充率,
R.string.ctr
});
DatabaseManager dbManager=newdatabasemanager(getApplicationContext());
dbManager.open();
mRawSiteData=dbManager.getSite(mAccountID);
dbManager.close();
}
私有void setUpUI(){
mActionBarHelper=新的ActionBarHelper(此);
mAppTitleTextView=(TextView)findViewById(R.id.AccountSummaryAppTitleTextView);
mappitletextview.setText(mRawSiteData.getSiteName());
mTabBarScrollView=(TabBarScrollView)findViewById(R.id.AccountSummaryTabBarScrollView);
mTabBarScrollView.setAdapter(mAdapter.getTabBarAdapter());
mTabBarScrollView.setOnItemOnClickListener(mAdapter);
mSlidingLayout=(SlidingLayout)findViewById(R.id.AccountSummary SlidingLayout);
mSlidingLayout.setAdapter(mAdapter.getSlidingLayoutAdapter());
mSlidingLayout.setOnDisplayChangeListener(mAdapter);
}
私有void updateTestData(){
mActionBarHelper.incrementRequests();
int daysToGet=getResources().getInteger(R.integer.account\u summary\u days);
MSITestService.DownloadDailySetTests(daysToGet,mRawSiteData.getSiteID(),new AdmobDownloadListener()){
公共无效onDownloadSuccess(对象obj){
mActionBarHelper.decrementRequests();
msitestdata=(ArrayList)obj;
//mAdapter.setsitestata(msitestdata);
}
public void onDownloadError(int errorCode,String errorMsg){
mActionBarHelper.decrementRequests();
显示ErrorMessage(errorCode,errorMsg);
}
});
}
公共void onClick(视图v){
开关(v.getId())
{
案例R.id.ActionBarreshImageButton:
updateTestData();
打破
}
}
}
这将很好地显示视图,但是滑动布局实际上将显示为空白(即,它不会膨胀线性布局中包含的视图)
SlidingLayout的源代码是:
package co.uk.gauntface.android.admob.views;
import co.uk.gauntface.android.admob.R;
import android.content.Context;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Adapter;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
public class SlidingLayout extends HorizontalScrollView {
private static final String TAG = "admob";
private int mSelectedPosition;
private int mNewSelectedPosition;
private LinearLayout mContainerLinearLayout;
private int mScaledTouchSlop;
private float mPrevX;
private int mItemCount;
private boolean mIsTouchEventScroll;
private SlidingLayoutAdapter mAdapter;
private DataSetObserver mDataSetObserver;
private OnDisplayChangeListener mDisplayChangeListener;
public SlidingLayout(Context context) {
super(context);
constructor();
}
public SlidingLayout(Context context, AttributeSet attrs) {
super(context, attrs);
constructor();
}
public SlidingLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
constructor();
}
private void constructor() {
Log.v(TAG, "SlidingLayout: constructor()");
mSelectedPosition = 0;
mNewSelectedPosition = 0;
mItemCount = 0;
mScaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v(TAG, "SlidingLayout: onTouchEvent()");
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) (mPrevX - event.getX());
scrollBy(deltaX, 0);
break;
case MotionEvent.ACTION_UP:
animateToPosition();
}
mPrevX = event.getX();
return true;
}
private void animateToPosition() {
Log.v(TAG, "SlidingLayout: animateToPosition()");
double scrollX = getScrollX();
int screenWidth = getWidth();
double ratio = scrollX / (double) screenWidth;
int whichScreen = (int) Math.round(ratio);
if(whichScreen >= 0 && whichScreen < mItemCount) {
int newX = whichScreen * screenWidth;
//int screenDiff = whichScreen - mDisplayedView;
int screenDiff = whichScreen - mSelectedPosition;
switch(screenDiff) {
case -1:
mNewSelectedPosition = mSelectedPosition - 1;
break;
case 0:
mNewSelectedPosition = mSelectedPosition;
break;
case 1:
mNewSelectedPosition = mSelectedPosition + 1;
break;
}
if(mNewSelectedPosition < 0) {
mNewSelectedPosition = 0;
} else if(mNewSelectedPosition >= mItemCount) {
mNewSelectedPosition = mItemCount - 1;
}
mIsTouchEventScroll = true;
smoothScrollTo(newX, 0);
}
}
public void setOnDisplayChangeListener(OnDisplayChangeListener changeListener) {
mDisplayChangeListener = changeListener;
}
public void setAdapter(SlidingLayoutAdapter adapter) {
Log.v(TAG, "SlidingLayout: setAdapter()");
if(mContainerLinearLayout == null) {
mContainerLinearLayout = new LinearLayout(getContext());
mContainerLinearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mContainerLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
mContainerLinearLayout.setBackgroundColor(getContext().getResources().getColor(R.color.admob_color));
addView(mContainerLinearLayout);
}
if(mAdapter != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
mAdapter = adapter;
if(mAdapter != null) {
mDataSetObserver = new SlidingLayoutDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
mItemCount = mAdapter.getCount();
mSelectedPosition = mAdapter.getSelectedPosition();
} else {
mItemCount = 0;
mSelectedPosition = 0;
return;
}
populateLayout();
}
// l is horizontal scroll origin, t is vertical
/**protected void onScrollChanged (int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(mIsTouchEventScroll) {
if(l % getWidth() == 0) {
mIsTouchEventScroll = false;
mSelectedPosition = mNewSelectedPosition;
if(mDisplayChangeListener != null) {
mDisplayChangeListener.onDisplayChange(l/getWidth());
}
}
}
}**/
private void populateLayout() {
Log.v(TAG, "SlidingLayout: populateLayout() - itemCount = "+mItemCount);
if(mContainerLinearLayout != null) {
mContainerLinearLayout.removeAllViews();
}
for(int i = 0; i < mItemCount; i++) {
View v = mAdapter.getView(i, null, null);
v.setMinimumWidth(getWidth());
mContainerLinearLayout.addView(v);
}
invalidate();
scrollTo(mSelectedPosition * getWidth(), 0);
//View childView = mContainerLinearLayout.getChildAt(mSelectedPosition);
//mContainerLinearLayout.invalidate();
//childView.invalidate();
Log.v(TAG, "SlidingLayout: populateLayout() scrollX - "+getScrollX());
//Log.v(TAG, "SlidingLayout: populateLayout() childView.width() - "+childView.getWidth());
Log.v(TAG, "SlidingLayout: populateLayout() getWidth() - "+getWidth());
Log.v(TAG, "SlidingLayout: populateLayout() getHeight() - "+getHeight());
//Log.v(TAG, "SlidingLayout: populateLayout() container.getWidth() - "+mContainerLinearLayout.getWidth());
//Log.v(TAG, "SlidingLayout: populateLayout() container.getHeight() - "+mContainerLinearLayout.getHeight());
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if(mAdapter != null) {
mItemCount = mAdapter.getCount();
mSelectedPosition = mAdapter.getSelectedPosition();
}
populateLayout();
}
public interface OnDisplayChangeListener {
abstract void onDisplayChange(int position);
}
public interface SlidingLayoutAdapter extends Adapter {
abstract int getSelectedPosition();
}
public class SlidingLayoutDataSetObserver extends DataSetObserver {
public SlidingLayoutDataSetObserver() {
super();
}
@Override
public void onChanged() {
Log.v(TAG, "SlidingLayout: onChanged()");
mItemCount = mAdapter.getCount();
mSelectedPosition = mAdapter.getSelectedPosition();
populateLayout();
}
@Override
public void onInvalidated() {
// Data is invalid so we should reset our state
//mItemCount = 0;
//mSelectedPosition = 0;//mAdapter.getSelectedPosition();
//Log.v(TAG, "SlidingLayout: onInvalidated() removeAllViews");
//mContainerLinearLayout.removeAllViews();
//invalidate();
//populateLayout();
//requestLayout();
Log.v(TAG, "SlidingLayout: onInvalidated()");
mItemCount = mAdapter.getCount();
mSelectedPosition = mAdapter.getSelectedPosition();
populateLayout();
}
}
}
package co.uk.gaunface.android.admob.views;
import co.uk.gaunface.android.admob.R;
导入android.content.Context;
导入android.database.DataSetObserver;
导入android.util.AttributeSet;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.ViewConfiguration;
导入android.widget.Adapter;
导入android.widget.HorizontalScrollView;
导入android.widget.LinearLayout;
公共类滑动布局扩展水平滚动视图{
私有静态最终字符串TAG=“admob”;
私人int mSelectedPosition;
私人int MNEWSELECTED职位;
私人线路布局mContainerLinearLayout;
私人内部MSCaledtouchlop;
私人浮动mPrevX;
私有内部mItemCount;
私有布尔mIsTouchEventScroll;
私人滑动布局调整器;
私有DataSetObserver mDataSetObserver;
私有OnDisplayChangeListener mDisplayChangeListener;
公共幻灯片布局(上下文){
超级(上下文);
构造函数();
}
公共幻灯片布局(上下文、属性集属性){
超级(上下文,attrs);
构造函数();
}
公共幻灯片布局(上下文,属性