Ресурсы $ NotFoundException выбрасываются при создании фрагмента в NativeScript на Android - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь создать фрагмент Android в Nativescript с намерением вставить в него карту Mapbox, чтобы я мог получить доступ к обратным вызовам жизненного цикла фрагмента.

Однако я продолжаю сталкиваться с этим исключением, которое яне понимаю:

System.err: android.content.res.Resources$NotFoundException: Unable to find resource ID #0xfffffff6
System.err:     at android.content.res.ResourcesImpl.getResourceTypeName(ResourcesImpl.java:269)
System.err:     at android.content.res.Resources.getResourceTypeName(Resources.java:1965)
System.err:     at android.support.v4.app.FragmentManagerImpl.loadAnimation(FragmentManager.java:1172)
System.err:     at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1808)
System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
System.err:     at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
System.err:     at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
System.err:     at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
System.err:     at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
System.err:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
System.err:     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
System.err:     at android.os.Handler.handleCallback(Handler.java:790)
System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
System.err:     at android.os.Looper.loop(Looper.java:164)
System.err:     at android.app.ActivityThread.main(ActivityThread.java:6518)
System.err:     at java.lang.reflect.Method.invoke(Native Method)
System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Поиск в течение нескольких часов дал мало результатов.

Документация неясна, но кажется, что тег Placeholder является правильным тегом для вставки нативных элементов управления, поэтому я предположил, что это то, что я использовал бы для вставки фрагмента Android.

Это правильно?

Итак, в моем компоненте есть тег Placeholder html:

<ActionBar title="Ng Mapbox Demo" class="action-bar">
</ActionBar>

<StackLayout class="page" id="page">
  <Placeholder (creatingView)="creatingView($event)" id="mapContainer"></Placeholder>
</StackLayout> 

В качестве простого доказательства реализации компонента концепции, основанного на числефрагментов, я придумала:


    public static newInstance() : MapFragment {

      return new MapFragment();

    } 

  creatingView( args : CreateViewEventData ) {

    let fragment = MapFragment.newInstance();

    let fragmentManager = args.context.getSupportFragmentManager();

    let fragmentTransaction = fragmentManager.beginTransaction(); 

    fragmentTransaction.replace( fragment.getId(), fragment );

    fragmentTransaction.commit();

    args.view = fragment;

  } 

и в моем файле mapfragment.android.ts у меня есть:


    public onCreateView( inflater: android.view.LayoutInflater, container: android.view.ViewGroup, savedInstanceState: android.os.Bundle ) {

      let result = super.onCreateView( inflater, container, savedInstanceState );

      // just doing this as an experiment to see if I can get it working.

      let nativeView = new android.widget.TextView( this.getActivity() );
      nativeView.setSingleLine(true);
      nativeView.setEllipsize(android.text.TextUtils.TruncateAt.END);
      nativeView.setText("Native");

// If I uncomment this line, the content appears but it takes over the
// entire screen clobbering the actionbar.
// 
//      container.addView( nativeView );

// if I return the nativeView like this I get the exception.

      return nativeView;

    } 

Я полагаю, что упускаю что-то очевидное или, может бытьесть фундаментальное недопонимание фрагментов.Я не смог найти четких примеров того, как это сделать, в NativeScript.

Если я вызываю addView () для контейнера, содержимое появляется, но оно забивает панель действий и захватывает весь экран.

Если я возвращаю nativeView, я получаю исключение.

Я не уверен, что мне не хватает или это ошибка.

Есть ли пример, который демонстрирует, как это сделать где-нибудь в Nativescript?

Я выполняю:

✔ Getting NativeScript components versions information...
✔ Component nativescript has 5.3.1 version and is up to date.
✔ Component tns-core-modules has 5.3.1 version and is up to date.
✔ Component tns-android has 5.3.1 version and is up to date.

1 Ответ

1 голос
/ 05 апреля 2019

PEBKAC - существует проблема между клавиатурой и стулом.

Основываясь на предложении увидеть, отслеживает ли исключение наличие тега Placeholder, я обнаружил, что ошибочно вызывал setFragmentClass (MapFragment).

Чтобы пример работал, я также добавил:

nativeView.setId( android.view.View.generateViewId() ); 

в onCreateView () и изменил creationView () в:

  creatingView( args : CreateViewEventData ) {

    let fragment = new MapFragment();

    let fragmentManager = args.context.getSupportFragmentManager(); 
    let fragmentTransaction = fragmentManager.beginTransaction();
    let framelayout = new android.widget.FrameLayout( args.context );
    framelayout.setId(android.view.View.generateViewId());

    fragmentTransaction.add( framelayout.getId(), fragment );

    fragmentTransaction.commit();

    args.view = framelayout; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...