我的应用程式如下:
主要活动使用的动作条
第一个选项卡是被分成3个部分的片段
| 线性布局包含列表视图| |线性布局包含列表视图| | 线性布局包含媒体控制和图像视图|
我有一个与媒体的控制开始填充图像视图(专辑封面)这个活动,一个充满中心列表视图,另外在两个AsyncTasks。
上述这些问题都运作良好。 列表视图的AsyncTask抛出一个进度对话框纺车。 这是在屏幕的中心上来。 我明白,我可以把这个微调到应用程序的右上角。 但是,我可以将它放在列表的顶部右视图线性布局,或者在线性布局背面中心? 这样,什么应用到进度条那就不显眼但很明显?
提前致谢
我明白,我可以把这个微调到应用程序的右上角。 但是,我可以将它放在列表的顶部右视图线性布局,或者在线性布局背面中心?
如果你可以计算出视图的位置,你可能能够定位ProgressDialog
您希望(例如看到这个问题我回答的代码进度的改变位置 )。 另外,请记住,这可能是谁也看到放置在一些奇怪的位置对话框,对话框屏幕的用户而言是非常反直觉的(他可能不会做出的位置之间的相关ProgressDialog
和视图,其数据被加载)。
另一个选项可以是修改当前布局为ListView
一部分在顶部的初始了添加FrameLayout
(其将覆盖整个ListView
)与模拟用于与一个屏幕的背景的背景Dialog
(此FrameLayout
将包含一个ProgressBar
置于你想在哪里)。 这FrameLayout
将作出可见当年AsyncTask
在踢(它可能是明智的,阻碍触摸事件的强调ListView
)。 通过这种方式,用户仍然可以做的东西在你的应用程序,它具有的明确指示View
正在加载其数据。 当然,这将工作做好,如果有可能,为用户与其他数据独立于装载工作ListView
。
从Luksprog答案是如此之好,我想我应该在这里列出代码:绝对完美main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/first_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/anchor" >
</ListView>
<View
android:id="@id/anchor"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_centerVertical="true"
android:background="#99cc00" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/anchor" >
<ListView
android:id="@+id/second_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#33c1c1c1"
android:visibility="gone" >
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|top"
android:indeterminate="true" />
</FrameLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private String[] mItems = { "Item no.1", "Item no.2", "Item no.3",
"Item no.4", "Item no.5", "Item no.6", "Item no.7", "Item no.8",
"Item no.9", "Item no.10", "Item no.11", };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
// setup the two ListViews
ListView firstList = (ListView) findViewById(R.id.first_list);
firstList.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mItems));
firstList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// just as an example, one you click an item in the first
// ListView
// a custom AsyncTask will kick in to load data in to the second
// ListView
new MyTask(MainActivity.this).execute((Void) null);
}
});
ListView secondList = (ListView) findViewById(R.id.second_list);
secondList.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mItems));
secondList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// just to test that you can't click the ListView if the data is
// loading
Toast.makeText(getApplicationContext(), "click",
Toast.LENGTH_SHORT).show();
}
});
}
private class MyTask extends AsyncTask<Void, Void, Void> {
private MainActivity mActivity;
private FrameLayout mFrameOverlay;
public MyTask(MainActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
// the AsyncTask it's about to start so show the overlay
mFrameOverlay = (FrameLayout) mActivity.findViewById(R.id.overlay);
// set a touch listener and consume the event so the ListView
// doesn't get clicked
mFrameOverlay.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
mFrameOverlay.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
// do heavy work
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
//remove the overlay
mFrameOverlay.setVisibility(View.GONE);
// setup the ListView with the new obtained data
String[] obtainedData = { "D1", "D2", "D3" };
ListView theList = (ListView) mActivity
.findViewById(R.id.second_list);
theList.setAdapter(new ArrayAdapter<String>(mActivity,
android.R.layout.simple_list_item_1, obtainedData));
}
}
}
Luksprog,希望你不介意我可以发布您的代码,只是不希望它从git的消失,这个答案输给别人。