JSON SQL Anfrage im Fragment starten

  • Antworten:14
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 7

22.03.2016, 14:47:22 via Website

Hallo zusammen :)

ich bin neu in der Welt der Android App Programmierer und habe ein kleines Problem...
Kurze Infos:

ich habe einen MySQL Server (Rasbperry pi) mit einer Datenbank gefüllt mit verschiedenen Temperatur Sensor werten.
Diese will ich mit einer App abfragen :)
Soweit klappt das auch schon mit einer einfachen einzelnen Activity.

Jetzt wollte ich das ganze schöner gestalten mit einem Navigation Drawer :)
leider kann ich das Fragment nicht starten, indem dann die SQL JSON abfrage gestartet wird...

Ich würde hier jetzt gerne meinen Code hochladen, aber bekomme ständig diese Fehlermeldung:
Um Spam in unserem Forum zu vermeiden, können neue Mitglieder vorerst keine Links auf externe Webseiten veröffentlichen.

Wie kann ich den Code hochladen?

Danke :)

Nachtrag:

MAIN.Activity

package com.example.abauer.rohdehome;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {

NavigationView navigationView = null;
Toolbar toolbar = null;

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


    HeizungFragment fragment = new HeizungFragment();
    android.support.v4.app.FragmentTransaction fragmentTransaction =
            getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment);
    fragmentTransaction.commit();


            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });

            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.setDrawerListener(toggle);
            toggle.syncState();

            navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);
        }

        @Override
        public void onBackPressed() {
            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {
                super.onBackPressed();
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();

            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }

        @SuppressWarnings("StatementWithEmptyBody")
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here.
            int id = item.getItemId();


            if (id == R.id.nav_pool) {

                PoolFragment fragment = new PoolFragment();
                android.support.v4.app.FragmentTransaction fragmentTransaction =
                        getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, fragment);
                fragmentTransaction.commit();



            } else if (id == R.id.nav_heizung) {

                HeizungFragment fragment = new HeizungFragment();
                android.support.v4.app.FragmentTransaction fragmentTransaction =
                        getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, fragment);
                fragmentTransaction.commit();



            } else if (id == R.id.nav_manage) {

            }

            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }

}

PoolFragment

package com.example.abauer.rohdehome;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class PoolFragment extends FragmentActivity {

TextView result, result1, result2;
RequestQueue requestQueue;

String showUrl2 = "xxxxxxxxxxxxxxxxxxxxxxx.php";


public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View myFragmentView = inflater.inflate(R.layout.fragment_pool, container, false);

    result = (TextView) findViewById(R.id.textViewSolar);
    result1 = (TextView) findViewById(R.id.textViewAussen);
    result2 = (TextView) findViewById(R.id.textViewPool);

    requestQueue = Volley.newRequestQueue(getApplicationContext());

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, showUrl2,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {

                        JSONArray temps = response.getJSONArray("temps");
                        for (int i = 0; i < temps.length(); i++) {
                            JSONObject temp = temps.getJSONObject(i);

                            String temp_solar = temp.getString("temp_solar");
                            String temp_aussen = temp.getString("temp_aussen");
                            String temp_pool = temp.getString("temp_pool");


                            result.setText(null);
                            result1.setText(null);
                            result2.setText(null);


                            result.append(temp_solar + "°C");
                            result1.append(temp_aussen + "°C");
                            result2.append(temp_pool + "°C");


                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    requestQueue.add(jsonObjectRequest);



    return myFragmentView;
}

}

Screenshot vom Fehler:
image

— geändert am 22.03.2016, 15:01:02

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

22.03.2016, 17:35:43 via Website

Hallo Andreas,
Herzlich wilkommen hier im Forum :)


Der Fehler kommt daher dass ein PoolFreagment (klasse) garkein Fragment ist (also nicht von Fragment erbt) sondern von FragmentActitvity.
Wenn du die Vererbung änderst sollte es passen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 7

22.03.2016, 17:45:24 via Website

Hallo Pascal :)

danke für deine schnelle Antwort :)

ich habe das gleich mal geändert, leider habe ich jetzt folgende sache:

User uploaded photo

User uploaded photo

— geändert am 22.03.2016, 17:47:18

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

22.03.2016, 17:54:06 via Website

Genau das hatte ich erwartet ;)

Jetzt hat du nämlich erstmal keinen Kontext mehr.

Statt getApplicationContext() kannst du getActivity() schreiben

und der Fehler bei den findViewByID(..)

die Zeilen müssen jetzt so aussehen:
myFragmentView.findViewById(...);

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 7

22.03.2016, 19:20:20 via Website

Danke Danke Danke :D

ich hab jetzt schon Tage meinen Fehler gesucht...
Jetzt funktioniert alles :)

wieso muss ich getActivity wählen?

Danke nochmal (angel)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

22.03.2016, 19:54:40 via App

Ah ok wenns funktioniert dann ist alles OK.
Ich dachte der ApplicationContext ist nicht verfügbar

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 7

24.03.2016, 15:20:21 via Website

Hallo Pascal :)

ich habe es jetzt die letzten Tage getestet und es funktioniert gut :)

jetzt habe ich noch eine weitere Frage :)

In meiner SQL Tabelle ist ein Wert Heizung, der entweder 1 oder 0 ist.

Das würde ich gerne so anzeigen lassen:

image

Rot ist Heizung aus = 0
Grün ist Heizung an = 1

leider stürzt die app immer ab wenn ich das Fragment Heizung aufrufe.

hier mein Code:

package com.example.abauer.rohdehome;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class HeizungFragment extends Fragment {

TextView result3, result4, result5, result6, result7, result8, result9, result10, result11 ,result12;
RequestQueue requestQueue;

ImageView img;


String showUrl1 = "xxxxxxxxxxxxxxxxxxx.php";



public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    final View myFragmentView = inflater.inflate(R.layout.fragment_heizung, container, false);

    result3 = (TextView) myFragmentView.findViewById(R.id.textViewStatusHeizung);
    result4 = (TextView) myFragmentView.findViewById(R.id.textViewStatusBrenner);
    result5 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_VL_FB);
    result6 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_RL_FB);
    result7 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_VL_HK);
    result8 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_RL_HK);
    result9 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_WW);
    result10 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_Zirkulation);
    result11 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_Erker);
    result12 = (TextView) myFragmentView.findViewById(R.id.textViewTemp_Abgas);
    img = ( ImageView) myFragmentView.findViewById(R.id.imageViewStateHeizung2);





    requestQueue = Volley.newRequestQueue(getActivity());

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, showUrl1,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {

                        JSONArray temps = response.getJSONArray("temps");
                        for (int i = 0; i < temps.length(); i++) {
                            JSONObject temp = temps.getJSONObject(i);

                            String temp_vl_fb = temp.getString("temp_VL_FB");
                            String temp_rl_fb = temp.getString("temp_RL_FB");
                            String temp_vl_hk = temp.getString("temp_VL_HK");
                            String temp_rl_hk = temp.getString("temp_RL_HK");
                            String temp_ww = temp.getString("temp_WW");
                            String temp_zirkulation = temp.getString("temp_Zirkulation");
                            String temp_erker = temp.getString("temp_Erker");
                            String temp_abgas = temp.getString("temp_Abgas");
                            String heizung = temp.getString("heizung");
                            String brenner = temp.getString("brenner");



                            result3.setText(null);
                            result4.setText(null);
                            result5.setText(null);
                            result6.setText(null);
                            result7.setText(null);
                            result8.setText(null);
                            result9.setText(null);
                            result10.setText(null);
                            result11.setText(null);
                            result12.setText(null);

                            result5.append(temp_vl_fb + "°C");
                            result6.append(temp_rl_fb + "°C");
                            result7.append(temp_vl_hk + "°C");
                            result8.append(temp_rl_hk + "°C");
                            result9.append(temp_ww + "°C");
                            result10.append(temp_zirkulation + "°C");
                            result11.append(temp_erker + "°C");
                            result12.append(temp_abgas + "°C");
                            result3.append(heizung + "");
                            result4.append(brenner + "");


                            if (heizung == "1"){

                                Drawable myDrawable = getResources().getDrawable(R.drawable.status_point_green);
                                img.setImageDrawable(myDrawable);

                            }else
                            {

                                Drawable myDrawable = getResources().getDrawable(R.drawable.status_point_red);
                                img.setImageDrawable(myDrawable);
                            }


                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });


    requestQueue.add(jsonObjectRequest);







    return myFragmentView;
}

}

Ich verstehe nur nicht wieso...

Danke

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

24.03.2016, 15:42:40 via Website

Das liegt daran:

  result3.setText(null);
                        result4.setText(null);
                        result5.setText(null);
                        result6.setText(null);
                        result7.setText(null);
                        result8.setText(null);
                        result9.setText(null);
                        result10.setText(null);
                        result11.setText(null);
                        result12.setText(null);

Du kannst keinen Text auf NULL setzen.
Du kannst nächstens einen Leerstring ("") übergeben.
Wenn du das bei allen machst, sollte es gehen.

Und noch etwas:
Bisher vergleichst du deinen String mit ==, dies kann zwar funktionieren, muss es aber nicht.
Nimm da lieber so was:

if(string1.equals(string2)){...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 7

24.03.2016, 15:56:50 via Website

Danke :)

habe es so abgeändert aber leider stürzt die app immer noch ab.

habe dieses LOG bekommen:

03-24 15:55:57.760 3627-3627/com.example.abauer.rohdehome E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.abauer.rohdehome, PID: 3627
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageDrawable(android.graphics.drawable.Drawable)' on a null object reference
at com.example.abauer.rohdehome.HeizungFragment$1.onResponse(HeizungFragment.java:117)
at com.example.abauer.rohdehome.HeizungFragment$1.onResponse(HeizungFragment.java:63)
at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

24.03.2016, 16:00:56 via Website

Deine ImageView wird auf dem Layout nicht gefunden.
Ist diese auch wiklich mit der passenden ID auf der XML?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 138

24.03.2016, 16:02:02 via App

Willst du ein Image in den Nav Drawer laden? Es scheint so als willst du ein Bild auf ein Objekt laden, das gar keines ist :)

Antworten
  • Forum-Beiträge: 7

24.03.2016, 16:09:38 via Website

kann man nicht auf ein ImageView in einem anderem Layout verweisen?
Ich habe ein "Home" Fragment mit einer kleiner Übersicht, was an und aus ist.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

24.03.2016, 16:12:54 via Website

Nein, das geht nicht, da müsstest du die Daten irgendwie rübertransferieren oder im Home Fragment nochmal laden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 7

28.03.2016, 13:09:43 via Website

Danke :)
ich habe die Daten nochmals im Home Fragment einzeln geladen.

Ich bin gerade am probieren und suchen wie ich einzelne Fragmente, wenn diese Angezeigt werden, nach bestimmter Zeit reloaden kann.
Hat von euch da einer Ideen?

Ich will das aktuell angezeigte Fragment alle 10 Sekunden refreshen.

Geht das überhaupt?

Schöne Feiertage :)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

28.03.2016, 14:09:54 via App

Das fragment selber nicht. Du kannst aber einen Timer nehmen bei finished deine Daten laden und die Views aktualisieren und dann den Timer erneut starten.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten

Empfohlene Artikel