【问题标题】:ProgressDialog shown behind another dialogProgressDialog 显示在另一个对话框后面
【发布时间】:2011-02-24 04:35:49
【问题描述】:

我的自定义对话框有一个需要很长时间才能获得的列表。所以我将它加载到使用 AsyncTask 在 onPrepareDialog 中启动的单独线程中。在调用 AsyncTask.execute 之前,我调用 ProgressDialog。问题是当我的对话框第一次被调用(onCreateDialog 被调用)时,ProgressDialog 显示在我的(空)对话框后面。如何在 hr 前面显示 ProgressDialog?当我的对话框被关闭并再次显示时,显示顺序是正确的。

public class MyActivity extends Activity {
FileSelectDlg fileSelectDlg = null;
LayoutInflater inflater;
ArrayList<String> fileList;


@Override
public void onCreate(Bundle savedInstanceState) {

    inflater = LayoutInflater.from(this);
}
@Override
protected Dialog onCreateDialog( int id ) 
{
    fileSelectDlg = new FileSelectDlg( this );
    return fileSelectDlg;
}
@Override
    protected synchronized void onPrepareDialog( int id, Dialog dialog ) {
    fileSelectDlg.update_dlg_view( -1 );
}

public class FileSelectDlg extends Dialog {
    private Context                 context;
    private BaseAdapter             adapter;

    public FileSelectDlg( Context context ) {
        super(context);
        this.context = context;

        View content = inflater.inflate( R.layout.file_select, null );
        setContentView( content );

        adapter = new BaseAdapter() {
            @Override
            public int getCount() {
                if( fileList != null )
                    return fileList.size();
                return 0;
            }
            @Override
            public Object getItem(int position) {
                return position;
            }
            @Override
            public long getItemId(int position) {
                return position;
            }
            @Override
            public View getView( int position, View convertView, ViewGroup parent ) {
                TextView textView;
                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.file_select_item, null);
                    textView = (TextView) convertView.findViewById(R.id.item_text);
                    convertView.setTag(textView);
                } else {
                    textView = (TextView)convertView.getTag();
                }
                if( fileList != null ) {
                    textView.setText( fileList.get( position ) );
                }
                return convertView;
            }
        };

        ListView listView = (ListView)findViewById( R.id.list );
        listView.setAdapter(adapter);
        listView.setOnItemClickListener( new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int clicked, long id ) {
                update_dlg_view( clicked );
            }
        });
    }
    public void update_dlg_view( int clicked ) {
        int option = option_get_list;
        String item = null;
        if( clicked >= 0 ) {
            item = fileList.get( clicked );
            fileSelector.setDir(item);
        }

        final ProgressDialog progressDialog = new ProgressDialog( context );
        progressDialog.setMessage( "wait..." );
        progressDialog.setCancelable(false);
        progressDialog.show();

        new AsyncTask<Integer, Integer, Long>() {
            protected Long doInBackground( Integer... _option ) {
                long option = _option[0];
                fileList = fileSelector.getList();
                return option;
            }
            @Override
            protected void onPostExecute( Long option ) {
                progressDialog.dismiss();
                FileSelectDlg.this.setTitle( fileSelector.getCurrentPath() );
                adapter.notifyDataSetChanged();
            }
        }.execute(option);
    }
}

【问题讨论】:

  • 你能把这段代码粘贴到这里吗?

标签: android dialog progressdialog z-order


【解决方案1】:

尝试在 onCreateDialog 中调用 AsyncTask.execute 以进行自定义对话。

【讨论】:

    【解决方案2】:

    也许尝试将 ProgressDialog 移动到 AsyncTask 中并使用onPreExecute() 创建和显示它。这将使 ProgressDialog 与其操作更加相关,并可能提供显示顺序所需的延迟。

        new AsyncTask<Integer, Integer, Long>() {
            ProgressDialog progressDialog;
    
            @Override
            protected void onPreExecute() {
                progressDialog = new ProgressDialog( context );
                progressDialog.setMessage( "wait..." );
                progressDialog.setCancelable(false);
                progressDialog.show();
            }
    
            @Override
            protected Long doInBackground( Integer... _option ) {
                long option = _option[0];
                fileList = fileSelector.getList();
                return option;
            }
    
            @Override
            protected void onPostExecute( Long option ) {
                progressDialog.dismiss();
                FileSelectDlg.this.setTitle( fileSelector.getCurrentPath() );
                adapter.notifyDataSetChanged();
            }
        }.execute(option);
    

    你也不必将它声明为 final :)

    【讨论】:

    • 使progressDialog 更“本地化”的好主意,但不幸的是它不会改变行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多