1

我的应用程序设计如下:

Main Activity 使用操作栏

第一个选项卡是一个片段,分为 3 个部分

| 包含列表视图的线性布局 | |包含列表视图的线性布局 | | 包含媒体控件和图像视图的线性布局|

我在这个活动中有两个 AsyncTask,一个填充中心列表视图,另一个从媒体控件开始填充图像视图(专辑封面)。

这两个都运作良好。List 视图 AsyncTask 会抛出一个进度对话框旋转轮。这将出现在屏幕的中央。我知道我可以把这个微调器放到应用程序的右上角。但是我可以将它放在列表视图线性布局的右上角,还是在线性布局的后面居中?这样一来,进度条应用于什么就不显眼但又很明显?

提前致谢

4

2 回答 2

2

我知道我可以把这个微调器放到应用程序的右上角。但是我可以将它放在列表视图线性布局的右上角,还是在线性布局的后面居中?

如果您可以计算视图的位置,您可能能够定位ProgressDialog您想要的位置(例如,请参阅我回答的这个问题Change position of progressbar in code)。另外,请记住,这对于会看到对话框屏幕和放置在某个奇怪位置的对话框的用户来说可能是非常反直觉的(他可能不会ProgressDialog在数据已加载)。

另一种选择可能是修改零件的当前布局,ListView以在顶部添加初始消失FrameLayout(将覆盖整个ListView),其背景模拟带有 a 的屏幕的背景Dialog(这FrameLayout将包含ProgressBar您想要放置的位置)。这FrameLayout将在启动时变得可见AsyncTask(阻止下划线的触摸事件可能是明智的ListView)。这样,用户仍然可以在您的应用程序中执行操作,并且它清楚地指示View正在加载其数据。当然,如果用户可以独立于 loading 使用其他数据,这将很有效ListView

于 2012-07-19T08:41:47.730 回答
2

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 中消失,而这个答案会丢失给其他人。

于 2012-07-19T20:03:49.680 回答