【问题标题】:Android MVVM - ViewPager displays nothingAndroid MVVM - ViewPager 不显示任何内容
【发布时间】:2018-01-16 21:48:29
【问题描述】:

一些背景知识 - 我正在尝试创建一个简单的应用程序来了解有关 mvvm、数据绑定、房间等的更多信息。该应用程序将有 2 个主要视图和设置,因此我认为使用抽屉式导航有点过分,并决定改用 ViewPager。 不幸的是,我无法让 ViewPager 显示使用 ViewModel 的片段,即使它只是一页。我的代码:

适配器#

(目前只添加了一页)

public class MainSectionsAdapter extends FragmentPagerAdapter {

private static final int SUMMARY = 0;
private static final int ENTRIES = 1;
private static final int ENTRIES2 = 2;


private static final int[] TABS = new int[]{SUMMARY};

private Context mContext;

public MainSectionsAdapter(final Context context, final FragmentManager fm) {
    super(fm);
    mContext = context.getApplicationContext();
}

@Override
public Fragment getItem(int position) {
    switch (TABS[position]) {
        case SUMMARY:
            return MainScreenFragment.newInstance();
        case ENTRIES:
            return EntriesFragment.newInstance();
        case ENTRIES2:
            return PlusOneFragment.newInstance();
    }
    return null;
}

@Override
public int getCount() {
    return TABS.length;
}

@Override
public CharSequence getPageTitle(int position) {
    switch (TABS[position]) {
        case SUMMARY:
            return mContext.getResources().getString(R.string.summary);
        case ENTRIES:
            return mContext.getResources().getString(R.string.data);
        case ENTRIES2:
            return mContext.getResources().getString(R.string.data);
    }
    return null;
}

}

活动

public class MainScreenActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainScreenBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main_screen);
    binding.setHandler(this);
    binding.setManager(getSupportFragmentManager());
}

@BindingAdapter({"bind:handler"})
public static void bindViewPagerAdapter(final ViewPager view, final MainScreenActivity activity) {
    final MainSectionsAdapter adapter = new MainSectionsAdapter(view.getContext(), activity.getSupportFragmentManager());
    view.setAdapter(adapter);
}

@BindingAdapter({"bind:pager"})
public static void bindViewPagerTabs(final TabLayout view, final ViewPager pagerView) {
    view.setupWithViewPager(pagerView, true);
}

}

片段

public class MainScreenFragment extends Fragment {

private MainScreenViewModel mainScreenVievModel;
private FragmentMainScreenBinding fragmentMainScreenBinding;

public MainScreenFragment() {
    // Required empty public constructor
}

public static MainScreenFragment newInstance() {
    return new MainScreenFragment();
}

@Override
public void onResume() {
    super.onResume();
    mainScreenVievModel.start();
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    fragmentMainScreenBinding = FragmentMainScreenBinding.inflate(inflater, container, false);

    fragmentMainScreenBinding.setViewmodel(mainScreenVievModel);

    setHasOptionsMenu(true);

    mainScreenVievModel = ViewModelProviders.of(this).get(MainScreenViewModel.class);

    return fragmentMainScreenBinding.getRoot();
}

活动布局

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fab="http://schemas.android.com/apk/res-auto">

<data>

    <import type="android.view.View" />

    <variable
        name="handler"
        type="horatii.realtdee.view.MainScreenActivity" />

    <variable
        name="manager"
        type="android.support.v4.app.FragmentManager" />
</data>

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true"
        app:title="@string/app_name"
        app:titleMarginStart="8dp" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:pager="@{(pager)}">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:handler="@{handler}" />
    </LinearLayout>

    <com.github.clans.fab.FloatingActionMenu
        android:id="@+id/fab_menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="8dp"
        android:layout_marginRight="8dp"
        android:src="@drawable/ic_add_black_24dp">

        <com.github.clans.fab.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_assessment_black_24dp"
            fab:fab_size="mini"
            fab:fab_label="Both" />
    </com.github.clans.fab.FloatingActionMenu>

</android.support.design.widget.CoordinatorLayout>

片段布局

<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

    <import type="android.view.View" />

    <variable
        name="viewmodel"
        type="horatii.realtdee.vievmodel.MainScreenViewModel" />

</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:text="@{viewmodel.testText}"/>
    </android.support.constraint.ConstraintLayout>
</RelativeLayout>

片段视图模型

public class MainScreenViewModel extends AndroidViewModel {
public final ObservableField<String> testText = new ObservableField<>();
private final SnackbarMessage mSnackbarText = new SnackbarMessage();
private final Context mContext; // To avoid leaks, this must be an Application Context.

public MainScreenViewModel(
        Application context) {
    super(context);
    testText.set("cipson");
    mContext = context.getApplicationContext(); // Force use of Application Context.
}

}

应用程序运行良好,但页面总是空的,我觉得我错过了一些东西。

【问题讨论】:

    标签: android mvvm data-binding android-viewpager android-livedata


    【解决方案1】:

    片段类内部:

    fragmentMainScreenBinding = FragmentMainScreenBinding.inflate(inflater, container, false);
    

    替换这一行:

    fragmentMainScreenBinding = DataBindingUtil.inflate(inflater, R.layout.<fragmentlayoutname>, container, false);
    

    【讨论】:

      【解决方案2】:

      您必须在 viewPagerAdapter 的 instantiateItem 方法中将View binding.getRoot() 添加到您的容器中,如下所示:

         container.addView(binding.getRoot());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多