2017-06-26 14 views
0

状況はありますか? ViewPager内に4つのFragmentがあり、すべての外観が全く同じであることが分かります。しかし、私が達成しようとしているのは、(ImageViewとそれに対応するテキストを変更するという点で)すべてのFragmentを異なるものにすることです。 しかし、ImageViewResourceを変更するコードをどこに置くのかはわかりません。なぜなら、常にnullのオブジェクト参照でメソッドを呼び出そうとしているからです。だから、私はエラーを取得しないように、Imageリソース(xmlではなく、java)を変更するコード行をどこに置かなければならないのか、それを曖昧にするために。さらに詳しい説明が必要な場合は、お気軽にお問い合わせください。どんな助けもありがとうございます。断片内の画像ビューは常にnull

のJava:

package com.mediatechindo.wahyu.materialuikit.template.WalktroughCategory.Style14; 

import android.annotation.SuppressLint; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 

import com.mediatechindo.wahyu.materialuikit.R; 

/** 
* Created by wahyu on 15/11/16. 
*/ 

@SuppressLint("ValidFragment") 
public class WalkthroughStyle14Fragment extends Fragment { 
    int wizard_page_position; 
    public ImageView imageView = null; 

    public WalkthroughStyle14Fragment(int position) { 
     this.wizard_page_position = position; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.walkthrough14_fragment, container, false); 

     imageView = (ImageView) view.findViewById(R.id.imagePage1); 
     imageView.setImageResource(R.drawable.ic_store); 

     return view; 
    } 

} 

フラグメントレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_walkthrough_style14" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/walkthrough14Background" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewPager" 
      android:layout_marginBottom="110dp" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_marginBottom="124dp" 
      android:animateLayoutChanges="true" 
      android:gravity="center" 
      android:orientation="horizontal"> 

      <View 
       android:id="@+id/indicator1" 
       android:layout_width="15dp" 
       android:layout_height="15dp" 
       android:layout_margin="2dp" 
       android:background="@drawable/ic_dot_grey" /> 

      <View 
       android:id="@+id/indicator2" 
       android:layout_width="15dp" 
       android:layout_height="15dp" 
       android:layout_margin="2dp" 
       android:background="@drawable/ic_dot_grey" /> 

      <View 
       android:id="@+id/indicator3" 
       android:layout_width="15dp" 
       android:layout_height="15dp" 
       android:layout_margin="2dp" 
       android:background="@drawable/ic_dot_grey" /> 

      <View 
       android:id="@+id/indicator4" 
       android:layout_width="15dp" 
       android:layout_height="15dp" 
       android:layout_margin="2dp" 
       android:background="@drawable/ic_dot_grey" /> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/buttonContainer" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:background="@color/walkthrough4Background" 
      android:orientation="horizontal"> 

      <Button 
       android:id="@+id/btnSignUp" 
       style="@style/ButtonWhite" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:onClick="onClick" 
       android:text="SIGN UP" /> 

      <Button 
       android:id="@+id/btnSignIn" 
       style="@style/ButtonMagenta" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:onClick="onClick" 
       android:text="SIGN IN" 
       android:textColor="@android:color/white" /> 

     </LinearLayout> 

    </RelativeLayout> 

</FrameLayout> 

エラー:私は今、画像リソースを変更しようとした断片を含むViewPager

package com.mediatechindo.wahyu.materialuikit.template.WalktroughCategory.Style14; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.bumptech.glide.DrawableRequestBuilder; 
import com.bumptech.glide.Glide; 
import com.bumptech.glide.load.resource.drawable.GlideDrawable; 
import com.bumptech.glide.request.animation.GlideAnimation; 
import com.bumptech.glide.request.target.SimpleTarget; 
import com.mediatechindo.wahyu.materialuikit.BuildConfig; 
import com.mediatechindo.wahyu.materialuikit.R; 

public class WalkthroughStyle14Activity extends AppCompatActivity implements View.OnClickListener { 
    private ViewPager viewPager; 
    ViewPagerAdapter viewPagerAdapter = null; 
    private View indicator1; 
    private View indicator2; 
    private View indicator3; 
    private View indicator4; 

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

     indicator1 = findViewById(R.id.indicator1); 
     indicator2 = findViewById(R.id.indicator2); 
     indicator3 = findViewById(R.id.indicator3); 
     indicator4 = findViewById(R.id.indicator4); 

     //Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows. 
     viewPager = (ViewPager) findViewById(R.id.viewPager); 
     viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(viewPagerAdapter); 
     viewPager.addOnPageChangeListener(new WizardPageChangeListener()); 


     View image = findViewById(R.id.activity_walkthrough_style14); 
     String url = BuildConfig.IMAGE_URL + "walkthrough/style-14/Welcome-14-960.jpg"; 
     String urlThumb = BuildConfig.IMAGE_URL + "walkthrough/style-14/Welcome-14-960-thumb.jpg"; 
     loadImageRequest(image, url, urlThumb); 



     updateIndicators(0); 




    } 


    private void loadImageRequest(final View bg, String url, String urlThumb) { 
     DrawableRequestBuilder<String> thumbnailRequest = Glide 
       .with(this) 
       .load(urlThumb); 

     Glide.with(this) 
       .load(url) 
       .thumbnail(thumbnailRequest) 
       .into(new SimpleTarget<GlideDrawable>() { 
        @Override 
        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { 
         bg.setBackground(resource); 
        } 
       }); 
    } 


    //Implementation of PagerAdapter that represents each page as a Fragment that is persistently kept in the fragment manager as long as the user can return to the page. 
    //Class that holds all the frames to swipe through 
    private class ViewPagerAdapter extends FragmentPagerAdapter { 

     private int WIZARD_PAGES_COUNT = 4; 

     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      WalkthroughStyle14Fragment walkthroughStyle14Fragment = new WalkthroughStyle14Fragment(position); 
      switch (position){ 
       case 1: 
        walkthroughStyle14Fragment.imageView.setImageResource(R.drawable.ic_store); 
        break; 
       default: 

        break; 
      } 
      return walkthroughStyle14Fragment; 
     } 

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

    } 

    //Change listener to call action when page is changed 
    private class WizardPageChangeListener implements ViewPager.OnPageChangeListener { 

     @Override 
     public void onPageScrollStateChanged(int position) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPageScrolled(int position, float positionOffset, 
            int positionOffsetPixels) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPageSelected(int position) { 
      updateIndicators(position); 
     } 
    } 

    //Method used to change the color of the dots when page is changed 
    public void updateIndicators(int position) { 
     switch (position) { 
      case 0: 
       indicator1.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot)); 
       indicator2.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator3.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator4.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       break; 
      case 1: 
       indicator1.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator2.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot)); 
       indicator3.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator4.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       break; 
      case 2: 
       indicator1.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator2.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator3.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot)); 
       indicator4.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       break; 
      case 3: 
       indicator1.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator2.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator3.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot_grey)); 
       indicator4.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_dot)); 
       break; 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     switch (view.getId()){ 
      case R.id.btnLoginSignupBack: 
       onBackPressed(); 
       break; 
      case R.id.btnSignIn: 
       Toast.makeText(this, "Button Sign In clicked!", Toast.LENGTH_SHORT).show(); 
       break; 
      case R.id.btnSignUp: 
       Toast.makeText(this, "Button Sign Up clicked!", Toast.LENGTH_SHORT).show(); 
       break; 
      default: 
       break; 
     } 
    } 
} 

活動を含む 活動スタックトレース

06-26 16:53:55.397 7240-7240/com.mediatechindo.wahyu.materialuikit E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.mediatechindo.wahyu.materialuikit, PID: 7240 
                        Theme: themes:{default=overlay:com.cyngn.hexo, iconPack:com.cyngn.hexo, fontPkg:com.cyngn.hexo, com.android.systemui=overlay:com.cyngn.hexo, com.android.systemui.navbar=overlay:com.cyngn.hexo} 
                        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference 
                         at com.mediatechindo.wahyu.materialuikit.template.WalktroughCategory.Style14.WalkthroughStyle14Activity$ViewPagerAdapter.getItem(WalkthroughStyle14Activity.java:94) 
                         at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:101) 
                         at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034) 
                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1248) 
                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
                         at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 
                         at android.view.View.measure(View.java:18799) 
                         at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) 
                         at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                         at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458) 
                         at android.widget.LinearLayout.measureVertical(LinearLayout.java:746) 
                         at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458) 
                         at android.widget.LinearLayout.measureVertical(LinearLayout.java:746) 
                         at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                         at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2899) 
                         at android.view.View.measure(View.java:18799) 
                         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2108) 
                         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1224) 
                         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1460) 
                         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
                         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) 
                         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                         at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                         at android.view.Choreographer.doFrame(Choreographer.java:606) 
                         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                         at android.os.Handler.handleCallback(Handler.java:739) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:148) 
                         at android.app.ActivityThread.main(ActivityThread.java:5461) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

また、エラースタックトレースをポストできますか? – Apoorv

+0

@Apoorvありがとうございます – Schaschi

+0

この行 'walkthroughStyle14Fragment.imageView.setImageResource(R.drawable.ic_store);'がクラッシュの原因です。フラグメントの 'onCreateView'がおそらくまだ呼び出されていないため、' getItem'で直接呼び出さないでください。したがって、 'ImageView'はまだnullです – Apoorv

答えて

0

あなたが親WalkthroughStyle14Fragmentのインスタンスを作成した後、すぐにそれにアクセスしようとしているので、あなたのパブリック変数ImageViewはnullです。レイアウトが膨らんでいないので、onCreateViewはまだ呼び出されていません。 FragmentPagerAdapter.getItem(int)にフラグメントを作成するのは正しい設計ですが、メンバー変数にアクセスするとうまくいかない場合があります。

いいオブジェクト指向の解決策は、WalkthroughStyle14Fragmentから4つの派生クラスを定義することです。それぞれ独自の背景/前景画像または他のカスタマイズを持つことができます。例えば。 WalkthroughStyle14FragmentOne,WalkthroughStyle14FragmentTwo,WalkthroughStyle14FragmentThree,WalkthroughStyle14FragmentFour。適切な画像/テキストをonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)に設定します。アダプタに表示されているフラグメントのセットに、それぞれのフラグメントの数を追加できます。渡された位置に従ってアダプタ内の適切なフラグメントをインスタンス化することができます。