ImageView im Fragment anpassen

  • Antworten:3
  • Bentwortet
Moeldius
  • Forum-Beiträge: 6

27.08.2018, 22:19:41 via Website

Hallo zusammen,

ich versuche hier mal mein Glück.
Folgendes liegt vor:
Die MainActivity enthält ein ViewPager/Fragmente, in einem dieser Fragmente ist ein GridLayout welches wiederum sechs CardViews mit wiederum je einem ImageView enthält.
Beim Starten der App sollen diese ImageViews je nach Datenbankeinträgen angezeigt werden.
Im Test rufe ich das ganze in der MainActivity wie folgt ab:

public void FavoritenBilderTest() {

ImageView Fav1 = findViewById(R.id.Start_Fav1_ImageView);

    DBHelper_Favoriten db_fav = new DBHelper_Favoriten(this);

    int positionsbild = 0;


    List<FavoritenTable> favoritendaten = db_fav.getAllFavoriten();
    for (FavoritenTable c : favoritendaten) {
        positionsbild = c.getFav1();
    }

    if (positionsbild == 1) {
        Fav1.setImageResource(R.drawable.maengelblatt);
    } else if (positionsbild == 2) {
        Fav1.setImageResource(R.drawable.schadensmeldung);

    }else{}
}

Dabei bekomme ich folgenden Fehler:

java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.moeldius.dbktsida/com.example.moeldius.dbktsida.Start.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.widget.ImageView.setImageResource(int)' on a null object
reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)'
on a null object reference
at com.example.moeldius.dbktsida.Start.MainActivity.FavoritenBilderTest(MainActivity.java:494)
at com.example.moeldius.dbktsida.Start.MainActivity.onCreate(MainActivity.java:96)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
at android.app.ActivityThread.-wrap11(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6944) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Verstehe nur nicht warum das Ganze und hoffe hier auf Hilfe.

Danke vielmals.

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

27.08.2018, 22:28:19 via Website

Hallo um in einem Fragment mit findviewbyId arbeiten zu können brauchst du den context der Activity oder der View, Layout.
Am einfachsten kannst du das in der onCreateView machen den da inflatest du ja dein layout und hast somit auch den context des Layout.

Ansonsten getActivity().findViewById(R.id......);

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View page = inflater.inflate(R.layout....., container, false);
Button button = (Button) page.findViewById(....)
return page;
}

— geändert am 27.08.2018, 22:43:46

Hilfreich?
Moeldius
Kommentieren
Moeldius
  • Forum-Beiträge: 6

27.08.2018, 22:45:39 via Website

Hallo Jokel,

danke für die schnelle Antwort.

Problem gelöst. (cool)

Hab es wie folgt gelöst:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_start, container, false);

    ImageView Fav1 = rootView.findViewById(R.id.Start_Fav1_ImageView);

    DBHelper_Favoriten db_fav = new DBHelper_Favoriten(this.getActivity());

    int positionsbild = 0;


    List<FavoritenTable> favoritendaten = db_fav.getAllFavoriten();
    for (FavoritenTable c : favoritendaten) {
        positionsbild = c.getFav1();
    }

    if (positionsbild == 1) {
        Fav1.setImageResource(R.drawable.maengelblatt);
    } else if (positionsbild == 2) {
        Fav1.setImageResource(R.drawable.schadensmeldung);

    }else{

    }        return rootView;
}

— geändert am 27.08.2018, 22:57:44

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

27.08.2018, 22:57:11 via Website

return rootView; reicht.

Mit return inflater.inflate(R.layout.fragment_start, container, false); übergibt du eine neu Instanz auf das layout . Somit sind deine findviewbyid ungültig zeigen auf eine andere Instanz als das der viewpager benutzt.

Hilfreich?
MoeldiusPascal P.
Kommentieren