我有一个库中的超类。这个库负责初始化一些基本的布局组件和其他东西。我的问题是,在设置子指定布局之前,加载布局需要1.x秒,并显示默认布局一段时间。
这是我超级班的方法:
public void InitializeWindow(Activity act, int layoutResourceId, String windowTitle,
Object menuAdapter, int slideMenuMode) {
super.setContentView(layoutResourceId);
super.setBehindContentView(R.layout.menu_frame);
this.menuAdapter = menuAdapter;
this.slideMenuMode = slideMenuMode;
setWindowTitle(windowTitle);
initializeSlidingMenu();
}
这是这样称呼的:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.InitializeWindow(this, R.layout.activity_home, "\t\tHome",
new MenuAdapter(this, R.menu.slide_menu), SlidingMenu.TOUCHMODE_FULLSCREEN);
}
该应用程序就像一个魅力,但它需要,因为我说1.x秒加载从子类传递的布局。为什么会这样?
根据要求,这是我的initializeSlideMenu()
方法:
public void initializeSlidingMenu() {
this.setSlidingActionBarEnabled(true);
getSlidingMenu().setBehindOffsetRes(R.dimen.actionbar_home_width);
getSlidingMenu().setShadowWidthRes(R.dimen.shadow_width);
getSlidingMenu().setShadowDrawable(R.drawable.shadow);
getSlidingMenu().setTouchModeAbove(slideMenuMode);
getSlidingMenu().setBehindScrollScale(0.25f);
ListView v = new ListView(this);
v.setBackgroundColor(Color.parseColor("#000000"));
v.setAdapter((ListAdapter) menuAdapter);
getSlidingMenu().setMenu(v);
}
答案 0 :(得分:2)
为避免此类问题,一般有三种方法。
让onCreate()在setContentView()调用之后尽快完成。您可以使用postDelayed runnable来延迟很少的初始化,这可能是早期阶段可能不需要的。
在视图准备就绪时执行某项任务,它会将Runnable添加到该视图的消息队列中。
摘录
view.post(new Runnable() {
@Override
public void run() {
}
});
如果上述任何一项都没有考虑“使用存根进行优化”链接:http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html
希望它有所帮助。
答案 1 :(得分:1)
我怀疑你的问题在于:
v.setAdapter((ListAdapter) menuAdapter);
您应该将此作为AsyncTask
的一部分。通过适配器执行加载通常会很慢。
以下是AsyncTask示例实现的片段:
//before starting the load, I pop up some indicators that I'm doing some loading
progressBar.setVisibility(View.VISIBLE);
loadingText.setVisibility(View.INVISIBLE);
AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() {
private ArrayList<Thing> thingArray;
@Override
protected Void doInBackground(Void... params) {
//this is a slow sql fetch and calculate for me
thingArray = MyUtility.fetchThings(inputValue);
return null;
}
@Override
public void onPostExecute(Void arg0) {
EfficientAdapter myAdapter = new EfficientAdapter(MyActivity.this, thingArray);
listView.setAdapter(myAdapter);
//after setting up my adapter, I turn off my loading indicators
progressBar.setVisibility(View.INVISIBLE);
loadingText.setVisibility(View.INVISIBLE);
RelativeLayout layout = (RelativeLayout)MyActivity.this.findViewById(R.id.spacey);
if (layout != null) {
LayoutInflater inflater = LayoutInflater.from(MyActivity.this);
View view = inflater.inflate(R.layout.name_tabled_sub, layout);
NamedTableView tableView = new NamedTableView(MyActivity.this, view);
}
progressBar.setVisibility(View.INVISIBLE);
loadingText.setVisibility(View.INVISIBLE);
}
};
loadingTask.execute();
您还可以使用Async任务执行“PreExecute”项目,以及更新。