1

我想为我的应用做一个4屏幕教程,但是当我尝试启动包含ViewPager的活动时收到此异常:Android View Pager IllegalStateException:已在此LayoutInflater上设置了一个工厂

java.lang.IllegalStateException: A factory has already been set on this LayoutInflater 
     at android.view.LayoutInflater.setFactory2(LayoutInflater.java:297) 
     at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.setFactory2(CalligraphyLayoutInflater.java:96) 
     at android.support.v4.view.LayoutInflaterCompatHC.setFactory(LayoutInflaterCompatHC.java:51) 
     at android.support.v4.view.LayoutInflaterCompat$LayoutInflaterCompatImplV11.setFactory(LayoutInflaterCompat.java:42) 
     at android.support.v4.view.LayoutInflaterCompat.setFactory(LayoutInflaterCompat.java:79) 
     at android.support.v4.app.Fragment.getLayoutInflater(Fragment.java:936) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490) 
     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1072) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:918) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1440) 
     at android.view.View.measure(View.java:16645) 
     at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:868) 
     at android.view.View.measure(View.java:16645) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2298) 
     at android.view.View.measure(View.java:16645) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1920) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1117) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1299) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5692) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:212) 
     at android.app.ActivityThread.main(ActivityThread.java:515 

起初我跟着this tutorial,但示例应用程序不使用支持库。比我试图按照this one仍然有例外。在我的手机上运行确定两个样本,想不通,为什么在我的项目是不工作

活动布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.app.Tutorial.TutorialActivity"> 

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</RelativeLayout> 

TutorialActivity:

import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.os.Bundle; 


public class TutorialActivity extends FragmentActivity { 
private ViewPager mPager; 
private PagerAdapter mPagerAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tutorial); 

    mPager = (ViewPager) findViewById(R.id.pager); 
    mPagerAdapter = new TutorialPagerAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 
} 

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
     // do nothing 
    } else { 
     // Otherwise, select the previous step. 
     mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
} 

} 

适配器:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class TutorialPagerAdapter extends FragmentPagerAdapter { 
public TutorialPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    TutorialFragment myFragment = new TutorialFragment(); 
    Bundle data = new Bundle(); 
    data.putInt("page", position); 
    myFragment.setArguments(data); 
    return myFragment; 
} 

@Override 
public int getCount() { 
    return 3; 
} 
} 

片段:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


public class TutorialFragment extends Fragment { 
private int mPageNumber; 
public static TutorialFragment create(int pageNumber) { 
    TutorialFragment fragment = new TutorialFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("page", pageNumber); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPageNumber = getArguments().getInt("page"); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_tutorial, container, false); 
} 

} 

SDK是最新的,我的目标是sdk 22,最小版本是9 ... Other SO threads是关于使用getLayoutInflater().setFactory(),但我没有在任何地方使用它。对此有何暗示?谢谢!

[编辑]我使用com.android.support:support-v4:22.1.1,而工作示例使用com.android.support:support-v4:18.0.0

回答

2

我有同样的问题,而这个问题是关系到书法库。 只需使用最新的书法库检查您的build.gradle文件:

compile 'uk.co.chrisjenx:calligraphy:2.1.0' 
相关问题