Android - “一个微调器不支持项目点击事件。调用此方法将引发异常。”

时间:2012-05-05 03:35:08

标签: java android spinner

我有一个程序,屏幕上有大约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();
    }
}
}
 }

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

2 个答案:

答案 0 :(得分:2)

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) {
    }
}
 }

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

答案 1 :(得分:1)

非常可能。将数据设置为数组并创建微调器。虽然spinner不支持click事件,但它确实做了选择,因此在创建微调器之后你会得到一些像这样的代码:

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中,或者只是在那里设置一些变量然后在你的布局中有一个按钮(在微调器之外)来获取变量你设置并开始在线活动。第二个选项可让用户改变主意,而不会开始不必要的在线活动。

希望这有帮助。