安卓 - "A spinner does not support item click events. Calling this method will raise an exception."



我有一个程序,屏幕大约有 50 个按钮,看起来相当丑陋。 每个按钮都有一个异步下载,它只是从一个按钮复制到另一个按钮,并将URL和文件名保存为更改。 我希望能够从使用按钮更改为使用一个微调器,希望只有一个异步下载任务,并且微调器作为选择下载 URL 和要另存为的文件名的方式运行。 这可能吗? 在阅读了一些关于它的文档后,我感到困惑。 感谢您的帮助。

更新:

使用下面建议的代码,我创建了这个:

public class SpinnerActivity extends Activity{

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private Button startBtn;
private ProgressDialog mProgressDialog;
Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[]= {"www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt",
    "www.abc.com/download/a.txt"
    };
String links[]= {"Server 1",
    "Server 2",
    "Server 3",
    "Server 4",
    "Server 5",
    "Server 6",
    "Server 7",
    };
public void onCreate(Bundle savedInstanceState )
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mProgressDialog = new ProgressDialog(SpinnerActivity.this);
mProgressDialog.setMessage("Please be patient, file downloading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

spDownloadFrom=(Spinner)findViewById(R.id.Spinner01);
spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, links);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spDownloadFrom.setAdapter(spinnerArrayAdapter);
spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(spDownloadFrom));
}
public class SpinnerListener implements OnItemSelectedListener
{
Spinner sp;
public SpinnerListener(View v)
{
    sp=(Spinner)findViewById(v.getId());
}
@Override
public void onItemSelected(AdapterView<?> arg0, View v, int arg2,
        long arg3) {
    //Call to download class
        new DownloadFile().equals(url[arg2].toString());

}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub
}
}
class DownloadFile extends AsyncTask<String, Integer, String> { //put your download code
@Override
protected void onPreExecute() {
    super.onPreExecute();
    mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
    super.onProgressUpdate(progress);
    mProgressDialog.setProgress(progress[0]);
}

@Override
protected String doInBackground(String... aurl) {
    try {
        URL url = new URL(aurl[0]);
        URLConnection connection = url.openConnection();
        connection.connect();
        int fileLength = connection.getContentLength();
        int tickSize = 2 * fileLength / 100;
        int nextProgress = tickSize;
        Log.d(
        "ANDRO_ASYNC", "Lenght of file: " + fileLength);
        InputStream input = new BufferedInputStream(url.openStream());
        String path = Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName() + "/files";
        File file = new File(path);
        file.mkdirs();
        File outputFile = new File(file, "test1.pdf");
        OutputStream output = new FileOutputStream(outputFile);
        byte data[] = new byte[1024 * 1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            if (total >= nextProgress) {
                nextProgress = (int) ((total / tickSize + 1) * tickSize);
                this.publishProgress((int) (total * 100 / fileLength));
            }
            output.write(data, 0, count);
        }
        output.flush();
        output.close();
        input.close();
        mProgressDialog.dismiss();
    } catch (Exception e) {
    }
    return null;
}
protected void onProgressUpdate(String... progress) {
     Log.d("Downloading",progress[0]);
}
@Override
protected void onPostExecute(String unused) {
    File file = new File(Environment.getExternalStorageDirectory()
            + "/Android/Data/" + getApplicationContext().getPackageName()
            + "/files/test1.pdf");
    Intent testIntent = new Intent(Intent.ACTION_VIEW);
    testIntent.setType("application/pdf");
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(file);
    intent.setDataAndType(uri, "application/pdf");
    try {
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(SpinnerActivity .this,
                "No Application Available to View PDF", Toast.LENGTH_LONG).show();
    }
}
}
 }

这对于我想要完成的事情是正确的吗?

public class Example extends Activity{
Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[]= {"www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt",
        "www.abc.com/download/a.txt"
        };
String links[]= {"Server 1",
        "Server 2",
        "Server 3",
        "Server 4",
        "Server 5",
        "Server 6",
        "Server 7",
        };
public void onCreate(Bundle savedInstanceState )
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    spDownloadFrom=(Spinner)findViewById(R.id.addQuotation_spinnerProduct);
    spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, links);
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spDownloadFrom.setAdapter(spinnerArrayAdapter);
    spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(spDownloadFrom));
}
public class SpinnerListener implements OnItemSelectedListener
{
    Spinner sp;
    public SpinnerListener(View v)
    {
        sp=(Spinner)findViewById(v.getId());
    }
    @Override
    public void onItemSelected(AdapterView<?> arg0, View v, int arg2,
            long arg3) {
        //Call to download class
            new DownloadFile().equals(url[arg2].toString());

    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }
}
class DownloadFile extends AsyncTask<String, String, String> { //put your download code
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... aurl) {

        return null;
    }
    protected void onProgressUpdate(String... progress) {
         Log.d("Downloading",progress[0]);
    }
    @Override
    protected void onPostExecute(String unused) {
    }
}
 }

这是一个示例类,可以满足您的要求。我没有运行它,如果有一些错误,我很抱歉,但基本的想法在这里。

很有可能。 将数据设置为数组并创建微调器。 虽然微调器确实不支持单击事件,但它确实会进行选择,因此在创建微调器后,您将拥有如下代码:

yourSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // Nothing to do here
    }
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,int pos, long id) {
        // Your code to get the URL and filename here
    }
});

您可以通过将所有必要的代码放在onItemSelected中来在选择后立即触发它,或者只是在那里设置一些变量,然后在布局中(微调器外部)有一个按钮来获取您设置的变量并开始在线活动。 第二个选项允许用户改变主意,而无需开始不需要的在线活动。

希望这有帮助。

相关内容

最新更新