2016-08-22 3 views
1

Also ich versuche, einen Viewpager von 26 verschiedenen Layouts basierend auf der gleichen Layoutdatei zu erstellen, und ich versuche, die Texte und Bilder durch ein Bündel zu übergeben. Ich habe den Textteil unten, aber ich bin verwirrt, wie man ein Bild in das Bündel legt.Ich versuche, Imageview auf viewpagerfragment zu übergeben

public class ScreenSlidePageFragment extends Fragment { 
//Resources mResources = getResources(); 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.alphabet, container, false); 
    TextView tv = (TextView)v.findViewById(R.id.alphabet); 
    // ImageView iv = (ImageView)v.findViewById(R.id.letter); 
    //Drawable drawable = mResources.getDrawable(R.drawable.aletter); 
    //iv.setImageDrawable(drawable); 
    tv.setText(getArguments().getString("msg")); 

    return v; 
} 


public static ScreenSlidePageFragment newInstance(String text, Drawable drawable) { 

    ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
    Bundle b = new Bundle(); 
    b.putString("msg", text); 
    // b.putInt(); 

    f.setArguments(b); 

    return f; 
} 

}

public Fragment getItem(int position) { 
     switch(position) { 
      case 0: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 1"); 
      case 1: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 2"); 
      case 2: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 3"); 
      case 3: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 4"); 
      case 4: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 5"); 
      case 5: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 6"); 
      case 6: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 7"); 
      case 7: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 8"); 
      case 8: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 9"); 
      case 9: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 10"); 
      case 10: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 11"); 
      case 11: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 12"); 
      case 12: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 13"); 
      case 13: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 14"); 
      case 14: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 15"); 
      case 15: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 16"); 
      case 16: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 17"); 
      case 17: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 18"); 
      case 18: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 19"); 
      case 19: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 20"); 
      case 20: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 21"); 
      case 21: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 22"); 
      case 22: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 23"); 
      case 23: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 24"); 
      case 24: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 25"); 
      case 25: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 26"); 
      default: return ScreenSlidePageFragment.newInstance("FirstFragment, Instance 1"); 

     } 
    } 
+0

oh Junge, der Schalter ... – lelloman

+0

yeah, der Schalter kann mit einer Karte verbessert werden, aber seien Sie vorsichtig von Speicherlecks – peshkira

+0

Hat die Art, wie ich es habe die App zu langsam laufen oder mehr Speicher als nötig? – Sai

Antwort

0

Sie sollten ein Imageview in Ihrem Alphabet Layout erklärt haben.

... some layout container ... 
<ImageView android:id="@+id/letter" android:width="wrap_content" android:height="wrap_content" /> 
... some other layouts... 

Dann können Sie in Ihrer onCreateView diese ImageView finden und Sie können die Ressource für dieses Bild aus dem Bundle erhalten.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.alphabet, container, false); 
    TextView tv = (TextView)v.findViewById(R.id.alphabet); 
    ImageView iv = (ImageView)v.findViewById(R.id.letter); 
    iv.setImageResource(getArguments().getInt("letter")); // maybe check first if the argument is set :) 
    tv.setText(getArguments().getString("msg")); 

    return v; 
} 

In Ihrer newInstance-Methode können Sie die richtige Ressource als Fragmentargument festlegen.

public static ScreenSlidePageFragment newInstance(String text, @DrawableRes int drawable) { 
    ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
    Bundle b = new Bundle(); 
    b.putString("msg", text); 
    b.putInt("letter", drawable); // this is the image in your drawable folder that you can access with R.drawable.letter_a (if the file is called letter_a.png 

    f.setArguments(b); 

    return f; 
} 
+0

Also plane ich ein Bild, ein Bild und eine Bildschaltfläche (wird den Text entfernen), so kann ich einfach alle drei auf die gleiche Weise richtig machen? – Sai

+0

Ja, im Allgemeinen können Sie alle Arten von primitiven und serialisierbaren/parzellierbaren Typen im Bundle übergeben. Wenn Sie jedoch mehr Daten übergeben möchten, sollten Sie eine Art von Diskriminator berücksichtigen, den Sie übergeben können, und dann die Arbeit im Fragment ausführen. Dies ist jedoch rein optional. – peshkira

+0

Ich erhalte diesen Fehler java.lang.NoSuchMethodError: com.bignerdranch.android.learningisfun.ScreenSlidePagerActivity.getDrawable für diesen Code Fall 0: return ScreenSlidePageFragment.newInstance ("FirstFragment, Instanz 1", getDrawable (R.drawable.aletter)); – Sai

0

Parcelable Verwendung ist flexibler, wenn Sie weitere Felder hinzufügen möchten.

Zuerst erstellen Sie Ihr eigenes Objekt, z. Screen.java die Felder enthalten Nachricht und Bild (Drawable)

public class Screen implements Parcelable { 

    public String message; 
    public Drawable picture; 
    private static final long serialVersionUID = 1L; 

    public Screen(String message, Drawable picture){ 
     this.message = message; 
     this.picture = picture; 
    } 

    /** 
    * constructor to rebuild object from the Parcel 
    * @param source, a parcel data 
    */ 
    public Screen(Parcel source) { 
     this.message = source.readString();  
     this.picture = new BitmapDrawable(
       ((Bitmap) source.readValue(Bitmap.class.getClassLoader())) 
     ); 
    } 

    /** 
    * describe the kind of special object 
    */ 
    @Override 
    public int describeContents() { 
     return hashCode(); 
    } 

    /** 
    * write this object in to a Parcel 
    */ 
    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(message);  
     dest.writeValue(((BitmapDrawable)picture).getBitmap()); 
    } 

    public static final Parcelable.Creator<Screen> CREATOR = new Parcelable.Creator<Screen>() { 
     public Screen createFromParcel(Parcel source) { 
      return new Screen(source); 
     } 

     public Screen[] newArray(int size) { 
      return new Screen[size]; 
     } 
    }; 

} 

Als nächstes können Sie die Parcelable in Ihrem Fragment vorbei und Empfangen starten.

public class ScreenSlidePageFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.alphabet, container, false); 
    TextView tv = (TextView)v.findViewById(R.id.alphabet); 
    ImageView iv = (ImageView)v.findViewById(R.id.letter); 


    final Screen screen = getArguments().getParcelable("screen"); 
    iv.setImageDrawable(screen.picture); 
    tv.setText(screen.message); 

    return v; 
} 


public static ScreenSlidePageFragment newInstance(String text, Drawable drawable) { 

    ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
    Screen screen = new Screen(text, drawable); 
    Bundle b = new Bundle(); 
    b.putParcelable("screen", screen); 
    f.setArguments(b); 

    return f; 
} 

Hoffe, das wird Ihnen helfen!

Verwandte Themen