2015-03-10 2 views
3

У меня есть WatchViewStub, который отлично работает сам по себе - он отображает правильную компоновку на соответствующем квадратном или круглом эмуляторе износа для Android. Но когда я пытаюсь использовать WatchViewStub в GridViewPager, он всегда отображает квадратный (или прямоугольный) макет даже на круглом эмуляторе. Можно ли использовать эти два вместе успешно?Можете ли вы использовать WatchViewStub в GridViewPager для Android Wear?

Вот некоторые фрагменты кода:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_wear); 

    GridViewPager pager = (GridViewPager) findViewById(R.id.activity_wear_pager); 
    pager.setAdapter(new gridViewPagerAdapter()); 

    DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.activity_wear_page_indicator); 
    dotsPageIndicator.setPager(pager); 
} 

Вот gridViewPagerAdapter:

private class gridViewPagerAdapter extends GridPagerAdapter { 
    @Override 
    public int getColumnCount(int arg0) { return 2; } 

    @Override 
    public int getRowCount() { return 1; } 

    @Override 
    protected Object instantiateItem(ViewGroup container, int row, int col) { 
     View view = null; 

     if (col == 0) { 
      view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.read_page_stub, container, false); 
      WatchViewStub stub = (WatchViewStub) view.findViewById(R.id.read_page_stub); 
      stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { 
       @Override 
       public void onLayoutInflated(WatchViewStub stub) { 
       } 
      }); 
     } 
     else { 
      view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.find_page_stub, container, false); 
      WatchViewStub stub = (WatchViewStub) view.findViewById(R.id.find_page_stub); 
      stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { 
       @Override 
       public void onLayoutInflated(WatchViewStub stub) { 
       } 
      }); 
     } 

     container.addView(view); 
     return view; 
    } 

    @Override 
    protected void destroyItem(ViewGroup container, int row, int col, Object view) { 
     container.removeView((View)view); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view==object; 
    } 
} 

Вот activity_wear.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.wearable.view.GridViewPager 
     android:id="@+id/activity_wear_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:keepScreenOn="true"/> 

    <android.support.wearable.view.DotsPageIndicator 
     android:id="@+id/activity_wear_page_indicator" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal|bottom"> 
    </android.support.wearable.view.DotsPageIndicator> 

</FrameLayout> 

Вот read_page_stub.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.wearable.view.WatchViewStub 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/read_page_stub" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:rectLayout="@layout/read_page_rect" 
    app:roundLayout="@layout/read_page_round" 
    tools:context=".WearApplication" 
    tools:deviceIds="wear"> 
</android.support.wearable.view.WatchViewStub> 

Тогда у меня есть два макета с моими взглядами. Они начинаются с:

read_page_rect.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scroll" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".WearApplication" 
    tools:deviceIds="wear_square"> 

read_page_round.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scroll" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".WearApplication" 
    tools:deviceIds="wear_round"> 

У меня есть один и тот же тип установки макета для find_page_stub, find_page_rect и find_page_round.

+0

Другим подходом было бы использовать FragmentGridPagerAdapter (который расширяет GridPagerAdapter) и заполнять фрагменты в getFragment (...) в виде SomeFragment.newInstance (listOfObjects .get (строка)); Затем в окне SomeFragment onCreateView вы создаете материал WatchViewStub. Это хорошо работает для меня, и мне не нужно было иметь дело с WindowInsets. – riper

ответ

2

Если WatchViewStub не показывает круглую компоновку, это означает, что он не принимает объект WindowInsets должным образом. GridViewPager должен потреблять его где-то в пути.

Вы можете исправить это. Способ сделать это (первая некоторая теория):

1) начать с чтения о View.dispatchApplyWindowInsets и View.onApplyWindowInsets

2), как эти два метода связаны в View это: dispatchApplyWindowInsets называется и проверяет, если есть слушатель; если да, то он доставляет WindowInsets только слушателю ; если нет, он доставляет WindowInsets до onApplyWindowInsets.

3) в ViewGroupGridViewPager10 - ViewGroup) он выполняет итерацию над детьми и проверяет, были ли вложены вставки; если да, то это прекращает их доставку;

4) в любой момент любой View/ViewGroup может принять решение прекратить доставку WindowInsets; когда это произойдет, любые дети, зависящие от него, не будут вести себя правильно по кругу;

теперь некоторые практики:

5) вы можете создать подкласс любой точки зрения у вас есть в вашей иерархии; сделайте это с помощью GridViewPager и начните экспериментировать с переопределением dispatchApplyWindowInsets и onApplyWindowInsets. Мое предположение - первое, что должно быть достаточно.

6) в переопределении dispatchApplyWindowInsets перебирать детей и звонить dispatchApplyWindowInsets каждому из них; таким образом WatchViewStub должны получать неизмененный WindowInsets с предыдущим isRound()->true методом

7), наконец, не забудьте позвонить super.dispatchApplyWindowInsets(windowInsets); вы хотите, чтобы GridViewPager делали все, что нужно, с помощью вставки.

Phew, довольно длинный, но должен помочь вам, а также дать вам некоторое представление о том, почему происходит происходящее. Я думаю, что у нас есть ошибка, чтобы исправить эту проблему GridViewPager, поэтому, возможно, после следующей версии вам не придется иметь дело с этим.

+0

Спасибо за информацию, это полезно, хотя я изо всех сил пытаюсь реализовать идею вашего подкласса - я столкнулся с исключительным исключением класса, и я не уверен, как его решить. Во всяком случае, это звучит как ошибка в Android Wear, поэтому, возможно, мой лучший курс действий на этом этапе - отказаться от подхода WatchViewStub и сделать мои макеты одинаковыми для прямого/круглого или найти способ динамически определять форму. –

+0

Какое исключение вы видите? Можете ли вы обновить свой вопрос? – gruszczy

0

Как упоминает @gruszczy, GridViewPager по умолчанию использует обратные вызовы WindowsInsets. Способ исправить это вручную установить его, чтобы не делать это с помощью кода:

mGridViewPager.setConsumeWindowInsets(false); 

Этот метод установлен внутренний логический атрибут, который используется на диспетчерский метод вставках. Как можно видеть здесь:

public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) { 
    insets = this.onApplyWindowInsets(insets); 
    if(this.mOnApplyWindowInsetsListener != null) { 
     this.mOnApplyWindowInsetsListener.onApplyWindowInsets(this, insets); 
    } 

    return this.mConsumeInsets?insets.consumeSystemWindowInsets():insets; 
} 

В качестве последнего замечания, это на версии 1.3.0 от поддержки носимой библиотеки. Я не уверен, что это включено в предыдущие версии ...

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