2017-01-22 14 views
0

Я работаю над приложением, в котором вы можете выполнить несколько тестов выбора, которые являются основным экраном на ViewPager и фрагментах, где на каждой странице viewpager один вопрос теста, и приложение работает достаточно хорошо, но есть что-то, чего я не могу достичь:Сообщение «Загрузка данных ...» на каждой странице фрагмента

Вопросы и ответы могут быть загружены из внутренней базы данных приложений sqlite, и они имеют текст, отформатированный с помощью некоторого html и отображаемый с помощью три веб-просмотров, а иногда и конкретные страницы занимают больше времени, чтобы полностью выполнить рендеринг, и когда я говорю «занимай больше времени», я не говорю о миллисекундах, может быть, в некоторых случаях они могут занять до двух-трех секунд, чтобы полностью отобразиться (очень редко, но бывает), поэтому я хотел бы показать сообщение в форме «Загрузка Dat a ... ", чтобы пользователи знали, что происходит.

Мне удалось создать приятный мигающий текст TextView, и я начну показывать его в самом начале «onCreateView» и отключить его (с помощью textView.setText («»)) в самом конце того же «onCreateView», метод, который включает метод drawPageN(), где отображаются все элементы страницы, но я не могу заставить его работать, поскольку появляется мигающая «Загрузка данных ...», но сразу исчезает, не отражая реального времени рендеринга, иногда страница все еще не полностью отображается, и сообщение уже исчезло.

Я пробовал другие методы, такие как «onViewCreated», чтобы отключить сообщение «загрузить текст», но результатов нет.

Я думал о «onPreExecute» и «onPostExecute», но для этого мне нужно выполнять задачи в «doItOnBackgroung» и не удается обновить интерфейс в фоновом потоке.

ОК, я думаю, что моя цель «в концепции» проста, но мне нужна помощь в том, как реализовать рабочую версию, скажем, где запустить индикатор прогресса и где его отключить.

Заранее спасибо.

Edit:

Я пытался Soba предложение использовать AsyncTask с onPreExecute, doInBackground и onPostExecute, но теперь он выдает ошибку при попытке раздуть точки зрения, и это определенно указывает на первый WebView в XML, поэтому я вставляю код и сообщение об ошибке в случае, если он помогает больше.

public static class TestSectionFragment extends Fragment { //static 

     private static final String ARG_SECTION_NUMBER = "section_number"; 
     private WebView webViewInstructions, webViewQuestion; 
     private LinearLayout ll, llTvQuestionInstructions; 
     private int res; 

     public TestSectionFragment() { 
     } 

     class asyncDrawPage extends AsyncTask<String, Integer, View> { 

      LayoutInflater inflater; 
      ViewGroup container; 

      @Override 
      protected View doInBackground(String... strConfig) { 

       View rootView; 
       Bundle arguments = getArguments(); 
       int pageNumber = arguments.getInt(ARG_SECTION_NUMBER); 

       if (strTheme.equals(testMe.theme_vivid)) { 
        rootView = inflater.inflate(R.layout.activity_test_vivid, container, false); 
       }else{ 
        rootView = inflater.inflate(R.layout.activity_test, container, false); 
       } 

       String testName = test.getTestName(); 
       int testCategory = test.getIdCategory(); 
       int questionsCount = test.getQuestions().size(); 

       drawPageN(rootView, pageNumber, testCategory, testName, questionsCount, strTheme); 

       return rootView; 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      asyncDrawPage asyncDraw = new asyncDrawPage(); 
      asyncDraw.inflater = inflater; 
      asyncDraw.container = container; 

      View rootView = null; 

      try { 
       rootView = asyncDraw.execute().get(); 
      } catch (java.lang.InterruptedException e) { 
       e.printStackTrace(); 
      } catch (java.util.concurrent.ExecutionException e) { 
       e.printStackTrace(); 
      } 

      return rootView; 
     } 
} 

drawPageN - это метод, который заполняет все виды (TextViews, WebViews и т. Д.).

И сообщение об ошибке (которое я должен был сократить, как это слишком долго, кстати):

01-23 10:09:33.133 24469-24469/com.testMe.testMe W/System.err: java.util.concurrent.ExecutionException: android.view.InflateException: Binary XML file line #74: Binary XML file line #74: Error inflating class android.webkit.WebView 
01-23 10:09:33.134 24469-24529/com.testMe.testMe E/testMeLogging: [Error] UncaughtExceptionHandler threade = Thread[AsyncTask #3,5,main], error java.lang.RuntimeException: An error occurred while executing doInBackground() 
01-23 10:09:33.135 24469-24469/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.report(FutureTask.java:94) 
01-23 10:09:33.135 24469-24516/com.testMe.testMe W/System.err:  at java.lang.RuntimeException: An error occurred while executing doInBackground() 
01-23 10:09:33.135 24469-24516/com.testMe.testMe W/System.err:  at android.os.AsyncTask$3.done(AsyncTask.java:309) 
01-23 10:09:33.135 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
01-23 10:09:33.135 24469-24469/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.get(FutureTask.java:164) 
01-23 10:09:33.135 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
01-23 10:09:33.135 24469-24469/com.testMe.testMe W/System.err:  at android.os.AsyncTask.get(AsyncTask.java:498) 
01-23 10:09:33.135 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
01-23 10:09:33.136 24469-24469/com.testMe.testMe W/System.err:  at com.testMe.testMe.ActivityTest$TestSectionFragment.onCreateView(ActivityTest.java:1062) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at java.lang.Thread.run(Thread.java:818) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err: Caused by: android.view.InflateException: Binary XML file line #74: Binary XML file line #74: Error inflating class android.webkit.WebView 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at com.testMe.testMe.ActivityTest$TestSectionFragment$asyncDrawPage.doInBackground(ActivityTest.java:1009) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at com.testMe.testMe.ActivityTest$TestSectionFragment$asyncDrawPage.doInBackground(ActivityTest.java:996) 
01-23 10:09:33.136 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 
01-23 10:09:33.136 24469-24516/com.testMe.testMe W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
01-23 10:09:33.137 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 
01-23 10:09:33.137 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 
01-23 10:09:33.137 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
01-23 10:09:33.137 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643) 
01-23 10:09:33.137 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679) 
01-23 10:09:33.137 24469-24516/com.testMe.testMe W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
01-23 10:09:33.137 24469-24516/com.testMe.testMe W/System.err: ... 4 more 
01-23 10:09:33.138 24469-24469/com.testMe.testMe W/System.err: Caused by: android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
01-23 10:09:33.138 24469-24516/com.testMe.testMe W/System.err: at android.view.InflateException: Binary XML file line #74: Error inflating class android.webkit.WebView 
01-23 10:09:33.138 24469-24469/com.testMe.testMe W/System.err: android.support.v4.view.ViewPager.populate(ViewPager.java:1272) 
01-23 10:09:33.138 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.view.ViewPager.populate(ViewPager.java:1120) 
01-23 10:09:33.139 24469-24469/com.testMe.testMe W/System.err:  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646) 
01-23 10:09:33.139 24469-24469/com.testMe.testMe W/System.err:  at android.view.View.measure(View.java:18911) 
01-23 10:09:33.139 24469-24469/com.testMe.testMe W/System.err:  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) 
01-23 10:09:33.139 24469-24469/com.testMe.testMe W/System.err:  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
01-23 10:09:33.140 24469-24469/com.testMe.testMe W/System.err:  at android.view.View.measure(View.java:18911) 
01-23 10:09:33.140 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5995) 
01-23 10:09:33.141 24469-24469/com.testMe.testMe W/System.err:  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
01-23 10:09:33.141 24469-24469/com.testMe.testMe W/System.err:  at android.view.View.measure(View.java:18911) 
01-23 10:09:33.141 24469-24469/com.testMe.testMe W/System.err:  at android.widget.LinearLayout.measureVertical(LinearLayout.java:901) 
01-23 10:09:33.141 24469-24469/com.testMe.testMe W/System.err:  at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
01-23 10:09:33.142 24469-24469/com.testMe.testMe W/System.err:  at android.view.View.measure(View.java:18911) 
01-23 10:09:33.142 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5995) 
01-23 10:09:33.142 24469-24469/com.testMe.testMe W/System.err:  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
01-23 10:09:33.142 24469-24469/com.testMe.testMe W/System.err:  at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2662) 
01-23 10:09:33.143 24469-24469/com.testMe.testMe W/System.err:  at android.view.View.measure(View.java:18911) 
01-23 10:09:33.144 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2157) 
01-23 10:09:33.146 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1261) 
01-23 10:09:33.146 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1498) 
01-23 10:09:33.146 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1140) 
01-23 10:09:33.146 24469-24469/com.testMe.testMe W/System.err:  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6232) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.view.Choreographer.doFrame(Choreographer.java:606) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
01-23 10:09:33.147 24469-24469/com.testMe.testMe W/System.err:  at android.os.Looper.loop(Looper.java:148) 
01-23 10:09:33.148 24469-24469/com.testMe.testMe W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5551) 
01-23 10:09:33.148 24469-24469/com.testMe.testMe W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
01-23 10:09:33.148 24469-24469/com.testMe.testMe W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)... 

Редактировать 3: В соответствии с предложениями добавлены несколько методов.

@SuppressLint("SetJavaScriptEnabled") 
public void drawPageN(View view, int pageNumber, int testCategory, 
         String testName, int questionsCount, String strTheme) { 

    String htmlText; 
    Context context = this.getActivity(); 

    tvFetchingData = (TextView) view.findViewById(R.id.llBody).findViewById(R.id.tvBlinking); 
    tvFetchingData.setTextColor(Color.BLACK); 
    tvFetchingData.setText("Loading data..."); 
    GeneralUtils.blinkText(tvFetchingData); 

    if (test.getQuestions() != null) { 

     Question question = test.getQuestions().get(pageNumber); 

     if (question.getInstructions()!=null){ 
      webViewInstructions = (WebView) view.findViewById(R.id.llBody) 
        .findViewById(R.id.llTvQuestionInstructions) 
        .findViewById(R.id.webViewInstructions); 

      llTvQuestionInstructions = (LinearLayout) view.findViewById(R.id.llBody) 
        .findViewById(R.id.llTvQuestionInstructions); 

      //webViewInstructions.setWebViewClient(new WebViewClient()); 
      //webViewInstructions.setWebViewClient(new MYWEBCLIENT()); 
      webViewInstructions.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        return false; 
       } 
       @Override 
       public void onPageFinished(WebView view, String url) { 
        if (webViewQuestion.getVisibility() != View.VISIBLE) { 
         webViewQuestion.setVisibility(View.VISIBLE); 
        } 
       } 
      }); 
      webViewInstructions.getSettings().setJavaScriptEnabled(true); 
      webViewInstructions.getSettings().setDomStorageEnabled(true); 
      webViewInstructions.setLayerType(View.LAYER_TYPE_NONE, null); 
      webViewInstructions.setBackgroundColor(Color.argb(1, 0, 0, 0)); 
      //remove copy text 
      webViewInstructions.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
        return true; 
       } 
      }); 
      webViewInstructions.setLongClickable(false); 
      webViewInstructions.setTag(true); 
      TestUtils.setZoom(webViewInstructions, null, context); 

      htmlText = getHtmlText(question.getInstructions()); 
      webViewInstructions.loadDataWithBaseURL("", htmlText, "text/html", "UTF-8", ""); 
     } else { 
      llTvQuestionInstructions.setVisibility(View.GONE); 
     } 

     webViewQuestion = (WebView) view.findViewById(R.id.llBody) 
       .findViewById(R.id.llTvQuestion) 
       .findViewById(R.id.webViewQuestion); 

     //webViewQuestion.setWebViewClient(new WebViewClient()); 
     //webViewQuestion.setWebViewClient(new MYWEBCLIENT()); 
     webViewQuestion.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       return false; 
      } 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       if (webViewQuestion.getVisibility() != View.VISIBLE) { 
        webViewQuestion.setVisibility(View.VISIBLE); 
        tvFetchingData.setText("Data loaded..."); 
       } 
      } 
     }); 
     webViewQuestion.getSettings().setJavaScriptEnabled(true); 
     webViewQuestion.getSettings().setDomStorageEnabled(true); 
     webViewQuestion.setBackgroundColor(Color.argb(1, 0, 0, 0)); 
     //remove copy text 
     webViewQuestion.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       return true; 
      } 
     }); 
     webViewQuestion.setLongClickable(false); 
     TestUtils.setZoom(webViewQuestion, null, context); 

     //set webview text 
     htmlText = getHtmlText(question.getQuestion()); 
     webViewQuestion.loadDataWithBaseURL("", htmlText, "text/html", "UTF-8", ""); 

     //ANSWERS 

     generatePossibleAnswersCheckBoxes(test.getQuestions().get(pageNumber), view, pageNumber); 

     // get the image name according to category, test number and 
     // question number 
     // example: c1-t1-q15.png 
     // String imageName = "c" + String.valueOf(testCategory) + "t" 
     // + testName + "q" + String.valueOf(pageNumber + 1); 

     String imageName = question.getImage(); 
     if (imageName!=null) { 
      res = getResources().getIdentifier(question.getImage(), "drawable", 
        context.getPackageName()); 
      if (res != 0) { 
       //set the red text indicating there is an image below 
       TextView tvImgInstructions = (TextView) view.findViewById(R.id.llBody) 
         .findViewById(R.id.llTvImgInstructions) 
         .findViewById(R.id.tvImgInstructions); 

       ApplicationConfiguration testMe = new ApplicationConfiguration(); 
       String imageInstructionsTextColor = testMe.imageInstructionsTextColor; 

       tvImgInstructions.setTextColor(Color.parseColor(imageInstructionsTextColor)); 
       tvImgInstructions.setText(GeneralUtils.getStringResourceByName(
         "textview_activitytest_imginstructions", context)); 
       TestUtils.setZoom(null, tvImgInstructions, context); 

       //get dimensions of question image 
       Drawable d = getResources().getDrawable(res); 
       int w = d.getIntrinsicWidth(); 
       int h = d.getIntrinsicHeight(); 
       //set img width and heigth to 90% of screen size to fit in screen 
       int screenWidth = GeneralUtils.getScreenWidth(context); 
       int imgWidth = (int)(screenWidth * 0.98); 
       int wScaleFactor = imgWidth*100/w; 
       int imgHeigth = h*wScaleFactor/100; 

       ImageView imgQuestion = new ImageView(context); 
       imgQuestion.setPadding(0, 50, 0, 0); 
       imgQuestion.setId(R.id.imgQuestionX); 
       imgQuestion.setTag(imageName); 
       LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(imgWidth, imgHeigth); 
       imgQuestion.setLayoutParams(parms); 

       //set a border for the image 
       imgQuestion.setAdjustViewBounds(true); 
       imgQuestion.setScaleType(ScaleType.CENTER_INSIDE); 
       imgQuestion.setBackgroundColor(Color.BLACK); 
       imgQuestion.setPadding(1,1,1,1); 
       imgQuestion.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

       imgQuestion.setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         Context context = v.getContext(); 
         String imgTag = (String) v.getTag(); 
         Bundle bImageData = new Bundle(); 
         bImageData.putString("imgTag", imgTag); 
         bImageData.putString("testName", test.getTestName()); 
         Intent intent = new Intent(
           context, 
           ActivityImgFullScreen.class); 
         intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
         intent.putExtras(bImageData); 
         startActivity(intent); 
        } 
       }); 
       ll = ((LinearLayout) view.findViewById(R.id.llQuestionImage)); 
       ll.addView(imgQuestion); 
       imgQuestion.setImageResource(res); 
      } else { 
       //for now used in literature for poems and additional text 
       //TODO: make a special field for text 
       TextView tvAdditionalText = new TextView(context); 
       String additionalText = question.getImage(); 
       tvAdditionalText.setTextColor(Color.BLACK); 
       int screenWidth = GeneralUtils.getScreenWidth(context); 
       int screenHeight = GeneralUtils.getScreenHeight(context); 
       float textSize = GeneralUtils.getTextSize(additionalText, screenWidth, screenHeight) * 3; 
       tvAdditionalText.setTextSize(textSize); 
       tvAdditionalText.setText(additionalText); 
       ll = ((LinearLayout) view.findViewById(R.id.llQuestionImage)); 
       ll.addView(tvAdditionalText); 
      } 
     } 
    } 

    if (webViewInstructions.getTag().equals(true)){ 
     webViewInstructions.setPadding(0, 0, 0, 0); 
    } 

    //add extra space so question image can be scrolled up and seen completely 
    //the space added is double the end test linear layout height 
    int llHeight=0; 
    if (img != null) { 
     llHeight = (img.getIntrinsicHeight()); // the heigth of the end test image 
    } 

    LinearLayout llSpacer = new LinearLayout(context); 
    LinearLayout.LayoutParams parmsSpacer = new LinearLayout.LayoutParams(llHeight, llHeight); 
    llSpacer.setLayoutParams(parmsSpacer); 
    ll.addView(llSpacer); 

    String strQuestion = GeneralUtils.getStringResourceByName("activitytest_labelview_question", context); 

    String pagerTextNoArrows=strQuestion + " " 
      + Integer.toString(pageNumber + 1) + "/" 
      + questionsCount; 

    if (strTheme.equals(testMe.theme_vivid)) { 
     TextView tvQuestionNumber = (TextView) view.findViewById(R.id.tvQuestionNumber); 
     tvQuestionNumber.setText(pagerTextNoArrows); 
    }else{ 
     String pagerText = "↑ " + pagerTextNoArrows + " ↓"; 

     VerticalLabelView vertical; 
     int defFontSize = GeneralUtils.getPrefsByScreenDensity(this.getActivity())[5]; 
     ll = ((LinearLayout) view.findViewById(R.id.llVerticalPager)); 
     int paddingLeft = GeneralUtils.dp2px(5, context); 
     int paddingBottom = GeneralUtils.dp2px(100, context); 
     ll.setPadding(paddingLeft, 0, 0, paddingBottom); 
     if (strTheme.equals(testMe.theme_blue)){ 
      ll.setBackgroundColor(Color.parseColor(testMe.btnStartColor_blue)); 
     } 

     vertical = new VerticalLabelView(context); 
     vertical.setTextColor(Color.WHITE); 
     vertical.setText(pagerText); 
     vertical.setTextSize(GeneralUtils.dp2px(defFontSize, this.getActivity())); 

     ll.addView(vertical); 
    } 
} 

@SuppressLint("SetJavaScriptEnabled") 
private void generatePossibleAnswersCheckBoxes(final Question question, 
               View view, final int pageNumber) { 

    Context context = view.getContext(); 
    String htmlText=""; 
    int i = 0; 
    final List<Answer> answers = question.getAnswers(); 
    nroAnswers = answers.size(); 

    if (ll != null) { 
     ll.removeAllViews(); 
    } 
    if (answers != null) { 
     for (Answer rbAnswer : answers) { 
      int cbIndex = answers.size()*pageNumber+i; 
      // linear layout to hold image checkbox and checkbox text 
      LinearLayout llCheckBox = new LinearLayout(context); 
      llCheckBox.setOrientation(LinearLayout.HORIZONTAL); // horizontal 
      llCheckBox.setGravity(Gravity.CENTER_VERTICAL); 
      llCheckBox.setPadding(0, 0, 0, 5); 
      //webview for answer 
      final WebView webView = new WebView(context); 
      webView.setVisibility(View.INVISIBLE); 
      //webView.setWebViewClient(new WebViewClient()); 
      //webView.setWebViewClient(new MYWEBCLIENT()); 
      webView.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        return false; 
       } 
       @Override 
       public void onPageFinished(WebView view, String url) { 
        if (webView.getVisibility() != View.VISIBLE) { 
         webView.setVisibility(View.VISIBLE); 
        } 
       } 
      }); 
      webView.getSettings().setJavaScriptEnabled(true); 
      webView.getSettings().setDomStorageEnabled(true); 
      webView.setBackgroundColor(Color.argb(1, 0, 0, 0)); 
      webView.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
        return true; 
       } 
      }); 
      webView.setLongClickable(false); 

      htmlText = getHtmlText(rbAnswer.getAnswer()); 
      webView.loadDataWithBaseURL("", htmlText, "text/html", "UTF-8", ""); 
      TestUtils.setZoom(webView, null, context); 

      // checkbox i 
      cbAnswer[cbIndex] = new ImageView(context); 
      cbAnswer[cbIndex].setTag("[email protected]" + rbAnswer.getIdAnswer()+ "@" + pageNumber); // 0=>unchecked|1=>checked 
      cbAnswer[cbIndex].setId(cbIndex); 

      // determine if checkbox is checked or not according to what 
      // is stored in array of already answered questions 
      int answeredInCurrentPage = test.getAnsweredQuestions().get(pageNumber).getIdAnswer(); 
      if (rbAnswer.getIdAnswer() == answeredInCurrentPage) { 
       if (voicerecognitionPreference){ 
        cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_checked_say); 
       }else{ 
        cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_checked); 
       } 
      } else { 
       if (voicerecognitionPreference){ 
        cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked_say); 
       }else{ 
        cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked); 
       } 
      } 

      int cbPadBottom = 5; 
      int cbPadTop = 5; 
      int cbPadRight = 15; 
      int cbPadLeft = 0; 
      cbAnswer[cbIndex].setPadding(cbPadLeft, cbPadTop, cbPadRight, cbPadBottom); 

      // add elements to linear layout 
      // create and add textview with "tooltip" say nro. 
      if (voicerecognitionPreference){ 
       addTextViewSay(llCheckBox, i+1); 
      } 

      llCheckBox.addView(cbAnswer[cbIndex]); 
      llCheckBox.addView(webView); 

      cbAnswer[cbIndex].setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

        Context context = v.getContext(); 

        //play click sound 
        SoundManager.playSound(context, testMe.getDefaultCheckBoxClickSound(), testMe.getSoundType()[0]); 
        ImageView cbSelected = (ImageView) v; 

        //String strRest = cbSelected.getTag().toString().substring(1); 
        //cbAnswer[cbIndex].setTag("1"+strRest); 

        int cbSelectedId = cbSelected.getId(); 
        int cbSelectedTagId = Integer.parseInt(cbSelected.getTag().toString().split("@")[1]); 
        for (int j = 0; j < answers.size(); j++) { 
         int cbIndex = answers.size()*pageNumber+j; 
         boolean isSelected = cbAnswer[j].getTag().toString().substring(0, 1).equals("1"); 
         if (cbIndex != cbSelectedId) { 
          // (cbAnswer[j].get 
          // .isChecked()==true && 
          // j!=cbSelectedId) 
          if (voicerecognitionPreference){ 
           cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked_say); 
          }else{ 
           cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked); 
          } 
          String strRest = cbAnswer[cbIndex].getTag().toString().substring(1); 
          cbAnswer[cbIndex].setTag("0"+strRest); 
         } else { 
          String cbAnswerJTag = cbAnswer[cbIndex].getTag().toString(); 
          String cbAnswerJState = cbAnswerJTag.split("@")[0]; 

          if (cbAnswerJState.equals("1")) { // 0=>unchecked|1=>checked 
           if (voicerecognitionPreference){ 
            cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked_say); 
           }else{ 
            cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_unchecked); 
           } 
           cbAnswer[cbIndex].setTag("[email protected]" + cbAnswerJTag.split("@")[1]); 
          } else { 
           if (voicerecognitionPreference){ 
            cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_checked_say); 
           }else{ 
            cbAnswer[cbIndex].setImageResource(R.drawable.checkbox_checked); 
           } 
           cbAnswer[cbIndex].setTag("[email protected]" + cbAnswerJTag.split("@")[1]); 
          } 
         } 
        } 
        test.getAnsweredQuestions().get(pageNumber).setIdAnswer(cbSelectedTagId); 
        test.getAnsweredQuestions().get(pageNumber).setIdQuestion(question.getIdQuestion()); 
       } 
      }); 
      ll = ((LinearLayout) view.findViewById(R.id.cbLayout)); 
      ll.addView(llCheckBox); 
      i++; 
     } 
    } 
} 
+0

Это происходит потому, что ViewPager загружает первые три экрана всегда. Например, экран с левой стороны <> Ваш экран <> Правый боковой экран. Таким образом, вы можете проверить, что ваш код должен работать, комментируя другие задачи async (слева и справа). –

+0

Большое спасибо за ваш ответ Charitha, я проверял, и у меня нет других задач async, работающих на этом экране, поэтому не уверен, что это может быть проблемой. –

+0

В качестве дополнительной информации на каждой странице фрагмента при рисовании каждой страницы я не делаю никаких специальных (или важных, трудоемких или сетевых) вычислений, просто считывая данные из ранее созданного массива, который считывает данные из sqlite, проблема заключается в том, что это на некоторых страницах пейджера просмотра (происходит случайным образом) требуется больше времени для полного отображения содержимого веб-страниц, поэтому я хотел бы показать пользователю какое-то сообщение. –

ответ

0

Как я наконец нашел решение, я решил ответить на мой собственный вопрос в случае полезно кому-либо еще.

После большой оптимизации методы drawPageN (который, как предполагает название предоставляет ev'ry страницу моего зрения пейджера), что я был в состоянии сделать с успехом является следующим:

Сначала я реорганизовал код, три webviews теперь будут загружаться с использованием onPageFinished на каждом из них, затем в onCreateView раздела Fragment. Я установил «Загрузка данных ...» мигающий текст TextView на и в последнем WebView onPageFinished Я установил текст TextView в пустую.

Я уже пробовал это раньше, но не имел успеха, но теперь ключевым моментом было достижение загрузки WebViews с использованием onPageFinished.

Я надеюсь, что это поможет кому угодно, и спасибо за все ваши усилия.

0

На самом деле, AsyncTask в onPreExecute() и onPostExecute методы вызываются в потоке пользовательского интерфейса, так что это совершенно безопасно, чтобы показать и отклонить ваш прогресс баров (или в случае, моргая TextViews) там.

@Override 
protected void onPreExecute() { 
    //Show progressbar 
} 

@Override 
protected Void doInBackground(Void... params) { 
    //Fetch data 
} 

@Override 
protected void onPostExecute(Void aVoid) { 
    //Dismiss progressbar 
    } 
+0

Большое спасибо Soba, я пробовал ваше предложение, но неясно, что это не сработало, оно вызывает ошибку при попытке раздуть представление (и с любопытством он указывает на первый веб-просмотр в XML-файле, который ниже некоторого edittext), и поэтому view возвращает null, а экран отображается черным цветом. Я отредактирую свое сообщение, чтобы добавить сообщение об ошибке и некоторый код, чтобы вы могли помочь мне дальше. Всего наилучшего! –

0

Использование onProgressUpdate и publishProgress методы AsyncTask для этого:

onProgressUpdate (Прогресс ...), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока фоновое вычисление все еще выполняется. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

Refer This Answer

+0

Большое спасибо за ваш быстрый ответ Амрут, я очень ценил и не знал об этих двух методах. Я бы хотел попробовать, но если вы прочитаете мой полный пост, проблема у меня есть, я не могу обновить интерфейс фрагмента в doInBackground, он выдает ошибку при попытке раздуть представление и, в частности, указывает к первому веб-просмотру. У вас есть идея, что может быть неправильным? –

+0

, чтобы избежать этих ошибок, вы должны использовать эти методы публикации. всякий раз, когда вы хотите обновить свой интерфейс от асинхронной задачи doinbackground, вызовите метод publishProgress.Это будет окончательный вызов метода onProgressUpdate в потоке Ui, поэтому вы можете выполнять любые операции пользовательского интерфейса в этом методе. –

+0

Привет, Amrut, чтобы начать с самого начала, я пытаюсь выполнить мой drawPage метода фрагмента в async-задаче (забыв о сообщение «Загрузка ...»), и как только он работает, я сосредотачиваюсь на прогрессе, но факт в том, что я даже не могу запустить drawPageN в doInBackground, поскольку он выдает указанную выше ошибку, заявляя, что не может раздуть представление. –

 Смежные вопросы

  • Нет связанных вопросов^_^