【问题标题】:Solve startActivity in fragment解决fragment中的startActivity
【发布时间】:2015-12-17 12:15:07
【问题描述】:

我的代码有问题。我的问题与startActivity() 有关。当应用程序在模拟器上运行时,它不起作用。导致问题的线路在最后描述。

我尝试打开一个新活动(this, newactivity.class),但问题仍然存在。

UpdateAnsList

public class UpdateAnsList extends Fragment{

    /**
     * @param args
     */
    final static String ARG_POSITION_ANSWER = "position";
    private String jsonResult;
        private ListView listView;
    public int selsub;
    public Activity activity; 
    public String tagsub;
    private Context mContext;
    private Activity mact;



    public UpdateAnsList(Activity _activity){
         mact = _activity;
        this.activity = _activity;
        super.onAttach(_activity);
        mContext = this.activity.getApplicationContext();
    }

    public enum SubSectionAnswer {
        TagArt,
        TagBio

    }


    public void StartUpdateAnsList(int v, String o){
        tagsub = o;
        selsub = v;     
        SubSectionAnswer currentSub = SubSectionAnswer.valueOf(tagsub);
        listView = (ListView) this.activity.findViewById(R.id.listView11);

        selectItemAns(selsub,currentSub);
        accessWebService();
    }

    private void selectItemAns(int position, SubSectionAnswer currentSub) {

        switch(currentSub){

        case TagArt:

            switch(position){   
            case R.id.buttonArt001:
                url = "myip/newfolder/question_2.php";
                tagdb = "info_general";
                break;

            case R.id.buttonArt002:
                url = "http://myip/newfolder/question_1.php";
                tagdb = "info_animation";
                break; 

            case 2:

                break; 

            }

            break;

        case TagBio:

            switch(position){   
            case R.id.ButtonBio001:
                url = "http://myip/newfolder/question_4.php";
                tagdb = "info_general";
                break;

            case R.id.buttonBio002:
                url = "http://myip/newfolder/question_5.php";
                tagdb = "info_evolution";
                break; 

            case 2:

                break; 

            }

            break;

        }


    }




    // Async Task to access the web
    private class JsonReadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(params[0]);
            try {
                HttpResponse response = httpclient.execute(httppost);
                jsonResult = inputStreamToString(
                        response.getEntity().getContent()).toString();
            }

            catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }



        private StringBuilder inputStreamToString(InputStream is) {
            String rLine = "";
            StringBuilder answer = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));

            try {
                while ((rLine = rd.readLine()) != null) {
                    answer.append(rLine);
                }
            }

            catch (IOException e) {
                // e.printStackTrace();
                //Toast.makeText(getApplicationContext(),
                //      "Error..." + e.toString(), Toast.LENGTH_LONG).show();
            }
            return answer;
        }

        @Override
        protected void onPostExecute(String result) {
            ListDrwaer();
        }
    }// end async task

    public void accessWebService() {
        JsonReadTask task = new JsonReadTask();
        // passes values for the urls string array
        task.execute(new String[] { url });
    }

    // build hash set for list view
    public void ListDrwaer() {
        List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();

        try {
            JSONObject jsonResponse = new JSONObject(jsonResult);
            JSONArray jsonMainNode = jsonResponse.optJSONArray(tagdb);

            for (int i = 0; i < jsonMainNode.length(); i++) {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                String name = jsonChildNode.optString("employee name");
                String number = jsonChildNode.optString("content_text");
                //String outPut = name + "-" + number;
                String outPut = name;
                String outPut1 = number; 
                employeeList.add(createEmployee("Question", outPut,"textlong",number));
            }
        } catch (JSONException e) {
            Toast.makeText(this.activity, "Error" + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }

        //new String[] { "employees" }
        //new int[] { android.R.id.text1 }
        String[] de = {"Question", "textlong"};
        int[] para ={R.id.textView1list11, R.id.textView11  };
        SimpleAdapter simpleAdapter = new SimpleAdapter(this.activity, employeeList,
                R.layout.activity_item_list_answer,
                de, para);
        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(new ListClickHandler());

        //Toast.makeText(getApplication(), "c", Toast.LENGTH_SHORT).show();

    }


    public class ListClickHandler implements OnItemClickListener{

        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {
            // TODO Auto-generated method stub
            int a =1 ;
            //Toast.makeText(mContext, "c", Toast.LENGTH_SHORT).show();
            //Intent i = new Intent(mact, QuestionActivity.class);
            //mContext.startActivity(i); 

            // create intent to perform web search for this planet
                        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                        intent.putExtra(SearchManager.QUERY, "test");
                        // catch event that there's no activity to handle intent
                        mContext.startActivity(intent);


        }

    }


    private HashMap<String, String> createEmployee(String s1, String s2, String s3,String s4) {
        HashMap<String, String> employeeNameNo = new HashMap<String, String>();
        employeeNameNo.put(s1, s2);
        employeeNameNo.put(s3, s4);
        return employeeNameNo;
    }




}

这是导致问题的行:

mContext.startActivity(intent);

调试画面:

我使用getActivity()时的屏幕:

【问题讨论】:

  • 当错误发生时请发布你的logcat
  • 您无法使用上下文启动活动。您要么需要对当前活动的引用,要么在片段的情况下,您可以简单地通过 getActivity().startActivity(new Intent(....));
  • 你也可以发布你的活动课程吗?
  • 您的 ListClickHandler 类必须首先声明为静态。稍后我会发布一个更好的做法来解决您的问题。注意:Fragment 有自己的 startActivity 方法,你可以使用它,但要明智

标签: android android-fragments android-intent start-activity


【解决方案1】:

您应该使用Activity 上下文开始新的Activity

getActivity.startActivity(intent);

【讨论】:

    【解决方案2】:

    这是一个Fragment 类,因此您无法通过简单地编写this.startActivity(); 来传递Intent
    你需要做的是获得这个Fragment类的Activity
    所以你应该写而不是mContext.startActivity(intent);

    getActivity().startActivity(intent);
    

    【讨论】:

      【解决方案3】:

      基本上你正在使用 Fragment

      如何从Fragment启动Activity

      mContext.startActivity(intent);
      

      编辑 1:

      private Context mContext;
      
       public void StartUpdateAnsList(Context ctx, int v, String o){
              mContext = ctx;
              tagsub = o;
              selsub = v;     
              SubSectionAnswer currentSub = SubSectionAnswer.valueOf(tagsub);
              listView = (ListView) this.activity.findViewById(R.id.listView11);
      
              selectItemAns(selsub,currentSub);
              accessWebService();
          }
      

      现在您可以使用:mContext.startActivity(intent);

      希望这会对你有所帮助。

      【讨论】:

      • 你怎么看。我的 getActivity 为空。我不知道为什么
      • 只有在片段附加到活动时才小心调用 getActivity()。当 Fragment 尚未附加,或者在其生命周期结束时被分离时,getActivity() 将返回 null。
      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多