Привязка данных ProgressBar progess равен нулю - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь установить прогресс ProgressBar, используя привязку данных.

Вот мой макет:

<data>
    <import type="java.lang.Integer"/>
    <variable
        name="sectionsViewModel"
        type="com.techiespace.projects.hark.SectionsViewModel" />
</data>
<!--Other views-->
<android.support.v7.widget.CardView
      android:id="@+id/bankcardId1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="10dp"
      android:clickable="true"
      android:focusable="true"
      android:foreground="?android:attr/selectableItemBackground"
      android:onClick="onClickSection1"
      app:cardBackgroundColor="@color/primary_light">

      <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:gravity="center"
          android:paddingLeft="30dp"
          android:paddingRight="30dp"
          android:text="1"
          android:textSize="144sp" />

      <ProgressBar
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          style="?android:attr/progressBarStyleHorizontal"
          android:max="100" 
          android:progress='@{Integer.parseInt(sectionsViewModel.getAccuracyLiveData[0].getAccuracy().split(" ")[1])}'
                    android:layout_centerVertical="true"
                    android:layout_centerHorizontal="true"
                    />
      <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text='@{sectionsViewModel.getAccuracyLiveData[0].getAccuracy().split(" ")[1]}' />
</android.support.v7.widget.CardView>
<!--Other views-->

Вызов sectionsViewModel.getAccuracyLiveData[0].getAccuracy().split(" ")[1] возвращает показатель точности String, который яизменилось на целое число, так как установка String as progress приводит к следующей ошибке:

Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:progress' with parameter type java.lang.String on android.widget.ProgressBar.
file:C:\Users\Shubham Sahu\StudioProjects\Hark\app\src\main\res\layout\activity_sections.xml
loc:64:44 - 64:111
****\ data binding error ****

Значение атрибута android:text="..." во втором TextView разрешается и отображается правильно (я проверил его, используя пользовательский ProgressBar и вставиввызов setProgress () в блоках try catch).Но это дает следующую ошибку времени выполнения при разрешении android:progress="..."

09-29 08:35:40.683 26771-26771/com.techiespace.projects.hark E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.techiespace.projects.hark, PID: 26771
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.techiespace.projects.hark/com.techiespace.projects.hark.SectionsActivity}: java.lang.RuntimeException: Failed to call observer method
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2584)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2666)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1493)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5769)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
     Caused by: java.lang.RuntimeException: Failed to call observer method
        at android.arch.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:225)
        at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:193)
        at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:184)
        at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:36)
        at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
        at android.arch.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:292)
        at android.arch.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:332)
        at android.arch.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:137)
        at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:123)
        at android.arch.lifecycle.ReportFragment.dispatch(ReportFragment.java:121)
        at android.arch.lifecycle.ReportFragment.onStart(ReportFragment.java:81)
        at android.app.Fragment.performStart(Fragment.java:2260)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1007)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1135)
        at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1985)
        at android.app.FragmentController.dispatchStart(FragmentController.java:163)
        at android.app.Activity.performStart(Activity.java:6627)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2666) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1493) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5769) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
     Caused by: java.lang.NumberFormatException: Invalid int: "null"
        at java.lang.Integer.invalidInt(Integer.java:138)
        at java.lang.Integer.parseInt(Integer.java:358)
        at java.lang.Integer.parseInt(Integer.java:334)
        at com.techiespace.projects.hark.databinding.ActivitySectionsBindingImpl.executeBindings(ActivitySectionsBindingImpl.java:224)
        at android.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:437)
        at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:409)
        at android.databinding.ViewDataBinding$OnStartListener.onStart(ViewDataBinding.java:1621)
        at java.lang.reflect.Method.invoke(Native Method)
        at android.arch.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:215)
        at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:193) 
        at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:184) 
        at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:36) 
        at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354) 
        at android.arch.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:292) 
        at android.arch.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:332) 
        at android.arch.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:137) 
        at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:123) 
        at android.arch.lifecycle.ReportFragment.dispatch(ReportFragment.java:121) 
        at android.arch.lifecycle.ReportFragment.onStart(ReportFragment.java:81) 
        at android.app.Fragment.performStart(Fragment.java:2260) 
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1007) 
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153) 
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1135) 
        at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1985) 
        at android.app.FragmentController.dispatchStart(FragmentController.java:163) 
        at android.app.Activity.performStart(Activity.java:6627) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2666) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1493) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5769) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

Я не понимаю, почему значение равно нулю при установке прогресса, в то время как текстовый атрибут TextView правильно отображает ненулевое значение.

Редактировать 1: SectionsViewModel.java

public class SectionsViewModel extends AndroidViewModel {

    private LiveData<List<Clips>> accuracyLiveData;

    public SectionsViewModel(@NonNull Application application, String vidId) {
        super(application);
        ClipsDao clipsDao = ClipDatabase.getDatabase(application).clipsDao();
        accuracyLiveData = clipsDao.findLiveAccById(vidId);
    }

    public LiveData<List<Clips>> getAccuracyLiveData() {
        return accuracyLiveData;
    }
}

Редактировать 2: Активность

public class SectionsActivity extends AppCompatActivity {

    String stopPoints;
    String videoId;
    String[] stopPointsArr;
    Intent intent;
    String originalXMLTranscript = "";

    ActivitySectionsBinding sectionsActivityBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sections);
        videoId = getIntent().getStringExtra("id");
        stopPoints = getIntent().getStringExtra("stop_points");
        originalXMLTranscript = getIntent().getStringExtra("xml_transcript");
        stopPointsArr = stopPoints.split(" ");
        intent = new Intent(this, EvaluateClipActivity.class);
        intent.putExtra("id", videoId);
        intent.putExtra("xml_transcript", originalXMLTranscript);
        SectionsViewModel sectionsViewModel = ViewModelProviders.of(this, new SectionsViewModelFactory(this.getApplication(), videoId)).get(SectionsViewModel.class);
        sectionsActivityBinding = DataBindingUtil.setContentView(this, R.layout.activity_sections);
        sectionsActivityBinding.setLifecycleOwner(this);
        sectionsActivityBinding.setSectionsViewModel(sectionsViewModel);
        setContentView(sectionsActivityBinding.getRoot());
    }
}

1 Ответ

0 голосов
/ 29 сентября 2018

Я отладил код, добавив точки останова в ActivitySectionsBindingImpl.java Код в этом файле вызывается дважды по некоторым причинам.При первом вызове функции sectionsViewModelGetAccuracyLiveData.getValue() в файле возвращается значение NULL, и, следовательно, последующий код не выполняется.В конце происходит вызов parseInt без проверки правильности переданного значения.Вот где возникает ошибка.

Причина, по которой приложение не аварийно завершало работу при доступе к тем же данным в TextView, заключалась в том, что все функции отмечены как ненулевые, кроме функции Integer.parseInt ().

Вот часть сгенерированного файла ActivitySectionsBindingImpl.java до исправления.

if (sectionsViewModel != null) {
    // read sectionsViewModel.getAccuracyLiveData
    sectionsViewModelGetAccuracyLiveData = sectionsViewModel.getAccuracyLiveData();
}
updateLiveDataRegistration(0, sectionsViewModelGetAccuracyLiveData);


if (sectionsViewModelGetAccuracyLiveData != null) {
    // read sectionsViewModel.getAccuracyLiveData.getValue()
    sectionsViewModelGetAccuracyLiveDataGetValue = sectionsViewModelGetAccuracyLiveData.getValue();
}


if (sectionsViewModelGetAccuracyLiveDataGetValue != null) {
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0]
    sectionsViewModelGetAccuracyLiveData0 = getFromList(sectionsViewModelGetAccuracyLiveDataGetValue, 0);
}


if (sectionsViewModelGetAccuracyLiveData0 != null) {
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy()
    sectionsViewModelGetAccuracyLiveData0GetAccuracy = sectionsViewModelGetAccuracyLiveData0.getAccuracy();
}


if (sectionsViewModelGetAccuracyLiveData0GetAccuracy != null) {
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString = sectionsViewModelGetAccuracyLiveData0GetAccuracy.split(" ");
}


if (sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString != null) {
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[6]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit6 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 6);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[1]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit1 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 1);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[4]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit4 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 4);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[7]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit7 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 7);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[2]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit2 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 2);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[5]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit5 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 5);
    // read sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[3]
    sectionsViewModelGetAccuracyLiveData0GetAccuracySplit3 = getFromArray(sectionsViewModelGetAccuracyLiveData0GetAccuracySplitJavaLangString, 3);
}


// read Integer.parseInt(sectionsViewModel.getAccuracyLiveData.getValue()[0].getAccuracy().split(" ")[1])
integerParseIntSectionsViewModelGetAccuracyLiveData0GetAccuracySplit1 = java.lang.Integer.parseInt(sectionsViewModelGetAccuracyLiveData0GetAccuracySplit1);

Исправление В моем XML-файле просто добавлена ​​нулевая проверка

android:progress= '@{sectionsViewModel.getAccuracyLiveData[0].getAccuracy().split(" ")[1] != null ? (int)Double.parseDouble(sectionsViewModel.getAccuracyLiveData[0].getAccuracy().split(" ")[1]) : 50}'

Хотя это решает проблему, я не до конца понимаю, почему ActivitySectionsBindingImpl.java вызывается дважды.

...