2017-04-08 5 views
0

나는 현재 사용중인 간단한 환영 슬라이더 활동에 사용자 정의 글꼴을 구현하려고합니다. 그러나, 나는 그것을 이전에했던 것과 같은 방식으로 구현하려고 시도했지만 계속 NullPointerException을 얻는다. 모든 것이 초기화되어 문제가 무엇인지 알 수는 없습니다. 모든 도움을 주시면 감사하겠습니다. 나는 전체 클래스와 XML 파일TextView에서 사용자 정의 글꼴 투구 NullPointerException

package com.example.introslider; 

import android.content.Context; 
import android.content.Intent; 
import android.graphics.Color; 
import android.graphics.Typeface; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.text.Html; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class WelcomeActivity extends AppCompatActivity { 
private ViewPager viewPager; 
private MyViewPagerAdapter myViewPagerAdapter; 
private LinearLayout dotsLayout; 
private TextView[] dots; 
private int[] layouts; 
private Button btnSkip, btnNext; 
private PrefManager prefManager; 



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

    // Checking for first time launch - before calling setContentView() 
    prefManager = new PrefManager(this); 
    if (!prefManager.isFirstTimeLaunch()) { 
     launchHomeScreen(); 
     finish(); 
    } 

    // Making notification bar transparent 
    if (Build.VERSION.SDK_INT >= 21) { 
     getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
    } 

    setContentView(R.layout.activity_welcome); 


    TextView tv = (TextView)findViewById(R.id.title_1); 
    Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/orbit.ttf"); 
    tv.setTypeface(tf); 

    viewPager = (ViewPager) findViewById(R.id.view_pager); 
    dotsLayout = (LinearLayout) findViewById(R.id.layoutDots); 
    btnSkip = (Button) findViewById(R.id.btn_skip); 
    btnNext = (Button) findViewById(R.id.btn_next); 


    // layouts of all welcome sliders 
    // add few more layouts if you want 
    layouts = new int[]{ 
      R.layout.welcome_slide1, 
      R.layout.welcome_slide2, 
      R.layout.welcome_slide3, 
      R.layout.welcome_slide4}; 

    // adding bottom dots 
    addBottomDots(0); 

    // making notification bar transparent 
    changeStatusBarColor(); 

    myViewPagerAdapter = new MyViewPagerAdapter(); 
    viewPager.setAdapter(myViewPagerAdapter); 
    viewPager.addOnPageChangeListener(viewPagerPageChangeListener); 

    btnSkip.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      launchHomeScreen(); 
     } 
    }); 

    btnNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // checking for last page 
      // if last page home screen will be launched 
      int current = getItem(+1); 
      if (current < layouts.length) { 
       // move to next screen 
       viewPager.setCurrentItem(current); 
      } else { 
       launchHomeScreen(); 
      } 
     } 
    }); 



} 

private void addBottomDots(int currentPage) { 
    dots = new TextView[layouts.length]; 

    int[] colorsActive = getResources().getIntArray(R.array.array_dot_active); 
    int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive); 

    dotsLayout.removeAllViews(); 
    for (int i = 0; i < dots.length; i++) { 
     dots[i] = new TextView(this); 
     dots[i].setText(Html.fromHtml("&#8226;")); 
     dots[i].setTextSize(35); 
     dots[i].setTextColor(colorsInactive[currentPage]); 
     dotsLayout.addView(dots[i]); 
    } 

    if (dots.length > 0) 
     dots[currentPage].setTextColor(colorsActive[currentPage]); 
} 

private int getItem(int i) { 
    return viewPager.getCurrentItem() + i; 
} 

private void launchHomeScreen() { 
    prefManager.setFirstTimeLaunch(false); 
    startActivity(new Intent(WelcomeActivity.this, MainActivity.class)); 
    finish(); 
} 

// viewpager change listener 
ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     addBottomDots(position); 

     // changing the next button text 'NEXT'/'GOT IT' 
     if (position == layouts.length - 1) { 
      // last page. make button text to GOT IT 
      btnNext.setText(getString(R.string.start)); 
      btnSkip.setVisibility(View.GONE); 
     } else { 
      // still pages are left 
      btnNext.setText(getString(R.string.next)); 
      btnSkip.setVisibility(View.VISIBLE); 
     } 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 

    } 

    @Override 
    public void onPageScrollStateChanged(int arg0) { 

    } 
}; 

/** 
* Making notification bar transparent 
*/ 
private void changeStatusBarColor() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     window.setStatusBarColor(Color.TRANSPARENT); 
    } 
} 

/** 
* View pager adapter 
*/ 
public class MyViewPagerAdapter extends PagerAdapter { 
    private LayoutInflater layoutInflater; 

    public MyViewPagerAdapter() { 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View view = layoutInflater.inflate(layouts[position], container, false); 
     container.addView(view); 

     return view; 
    } 

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

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


    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     View view = (View) object; 
     container.removeView(view); 
    } 
} 
} 

그리고 XML

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

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:gravity="center_horizontal" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/title_1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/slide_1_title" 
      android:textColor="@android:color/white" 
      android:textSize="@dimen/slide_title" 
      android:textStyle="bold" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="20dp" 
      android:paddingLeft="@dimen/desc_padding" 
      android:paddingRight="@dimen/desc_padding" 
      android:text="@string/slide_1_desc" 
      android:textAlignment="center" 
      android:textColor="@android:color/white" 
      android:textSize="@dimen/slide_desc" /> 

    </LinearLayout> 
</RelativeLayout> 

그리고 스택 추적

04-08 20:23:08.386 20697-20697/com.example.introslider E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.example.introslider, PID: 20697 
                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.introslider/com.example.introslider.WelcomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                     at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6119) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTypeface(android.graphics.Typeface)' on a null object reference 
                     at com.example.introslider.WelcomeActivity.onCreate(WelcomeActivity.java:55) 
                     at android.app.Activity.performCreate(Activity.java:6679) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
                     at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:154)  
                     at android.app.ActivityThread.main(ActivityThread.java:6119)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
+0

"하지만 계속 NullPointerException이 발생합니다."- 질문을 편집하고 전체 Java 스택 추적을 게시하십시오. – CommonsWare

+0

스택 추적을 게시하십시오 –

+0

게시. Thanks CommonsWare, Yohannes – Spectose

답변

0

당신은 당신의 TextView에 서체를 설정하고 있지만 TextView을 포함 시켰습니다 R.layout.activity_welcome 레이아웃에 없습니다. 그것이 참조가 null이고 앱이 충돌하는 이유입니다.

+0

죄송합니다 Lorenzo, 잘못된 XML 파일을 업로드했습니다. "올바른"파일이 첨부되었습니다. – Spectose

+0

여기에는'ViewPager'와'Button's가 포함되지 않습니다. 당신은 팽창하지 않은'View'와 함께'findViewById'를 사용할 수 없습니다. 그렇지 않으면'NullPointerException'이 생깁니다. – quiro