簡體   English   中英

findViewById(int)方法未定義

[英]The method findViewById(int) is undefined

我是Android開發的新手,我正在嘗試編寫一個小應用程序,它允許我獲取外部JSON文件並解析它。 我得到了它的工作,但如果我嘗試在后台執行它作為AsyncTask它不會工作。 Eclipse給了我錯誤

對於LongOperation類型,方法findViewById(int)未定義

在這一行:

TextView txtView1 =(TextView)findViewById(R.id.TextView01);

這是我的代碼:

public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new LongOperation().execute();
    }
}


class LongOperation extends AsyncTask<String, Void, String> {
    private final Context LongOperation = null;


    @Override
    protected String doInBackground(String... params) {
        try {
            URL json = new URL("http://www.corps-marchia.de/jsontest.php");
            URLConnection tc = json.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream()));

            String line;
            while ((line = in.readLine()) != null) {
                    JSONArray ja = new JSONArray(line);
                    JSONObject jo = (JSONObject) ja.get(0);
                    TextView txtView1 = (TextView)findViewById(R.id.TextView01);
                    txtView1.setText(jo.getString("text") + " - " + jo.getString("secondtest"));
            }
        } catch (MalformedURLException e) {
            Toast.makeText(this.LongOperation, "Malformed URL Exception: " + e, Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(this.LongOperation, "IO Exception: " + e, Toast.LENGTH_LONG).show();
        } catch (JSONException e) {
            Toast.makeText(this.LongOperation, "JSON Exception: " + e, Toast.LENGTH_LONG).show();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
    }
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        ProgressDialog pd = new ProgressDialog(LongOperation);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("Working...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
    }    

}

有想法該怎么解決這個嗎?

這是你應該做的,使它按你想要的方式工作。 使用onPostExecude()

public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new LongOperation(this).execute();
    }
}


class LongOperation extends AsyncTask<String, Void, String> {
    private Main longOperationContext = null;

    public LongOperation(Main context) {
        longOperationContext = context;
        Log.v("LongOper", "Konstuktor");
    }

    @Override
    protected String doInBackground(String... params) {
        Log.v("doInBackground", "inside");
        StringBuilder sb = new StringBuilder();

        try {
            URL json = new URL("http://www.corps-marchia.de/jsontest.php");
            URLConnection tc = json.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream()));

            String line;
            while ((line = in.readLine()) != null) {
                    JSONArray ja = new JSONArray(line);
                    JSONObject jo = (JSONObject) ja.get(0);
                    Log.v("line = ", "jo.getString() ="+jo.getString("text"));
                    sb.append(jo.getString("text") + " - " + jo.getString("secondtest")).append("\n");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
            Log.v("Error", "URL exc");
        } catch (IOException e) {
            e.printStackTrace();
            Log.v("ERROR", "IOEXECPTOIn");
        } catch (JSONException e) {
            e.printStackTrace();
            Log.v("Error", "JsonException");
        }
        String result = sb.toString();
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.v("onPostExe", "result = "+result);
      TextView txtView1 = (TextView)longOperationContext.findViewById(R.id.textView01);
      txtView1.setText(result);


    }
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        ProgressDialog pd = new ProgressDialog(longOperationContext);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("Working...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
    }    

}

你正在嘗試做一些不起作用的事情。 首先,您在擴展AsyncTask的類中,因此您不會使用該方法,因為它是Activity類的方法。

第二個問題是您正在嘗試在與UI線程不同步的方法中執行UI內容。 這不是你想做的事。

doInBackground方法中處理您的JSON響應,並將結果傳遞給onPostExecute方法,在該方法中,當UI與UI線程同步時,您將能夠處理UI內容。

您當前的設置將無法讓您更輕松地處理您嘗試執行的操作。 您可以將LongOperation類設置為Activity類的私有類,並將TextView定義為實例成員。 使用OnCreate findViewById其從布局中onPostExecute ,並在AsyncTaskonPostExecute方法中修改(設置文本或其他內容)。

我希望我的意思有點清楚。

在其中一個答案中實現AsyncTask是有缺陷的。 每次在publishProgress創建進度對話框,並且在方法外部看不到對話框的引用。 這是我的嘗試:

public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new LongOperation().execute();
    }
    class LongOperation extends AsyncTask<String, Void, String> {
        ProgressDialog pd = null;
        TextView tv = null;

        @Override
        protected void onPreExecute(){
            tv = Main.this.findViewById(R.id.textvewid);
            pd = new ProgressDialog(Main.this);
            pd.setMessage("Working...");
            // setup rest of progress dialog
        }
        @Override
        protected String doInBackground(String... params) {
            //perform existing background task
            return result;
        }
        @Override
        protected void onPostExecute(String result){
            pd.dismiss();
            tv.setText(result);
        }
    }
}

findViewById是Activity類中的方法。 您應該在創建活動時將實例的實例傳遞給LongOperation。 然后使用該實例調用findViewById。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM