2016-04-13 2 views
1

Also ich habe diese Fehlermeldung, nicht auflösen kann Symbol in fragment_ Haupt xml und es kommt auf dieser CodezeileKann nicht Symbol Fehler im XML-Layout (Udacity Sonnenschein Lektion 2)

Tools lösen. MainActivity $ ForecastFragment "> der ForecastFragment Teil davon ist in rot

Bitte beachten Sie, die App läuft immer noch gut, es ist nur dieser Teil meines Codes ist in rot und hat eine Fehlermeldung. Wie kann ich das beheben? Wird dies in Zukunft beim Entwickeln dieser App zu meinem Code führen? Unten sind die beiden Hauptaktivitäten der Java-Dateien, ForecastFragment und xml. Ich habe Clean Code versucht und den Fehler nicht behoben. Bitte helfen Sie mir hier neu.

package com.example.android.sunshine.app; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

/** 
* Encapsulates fetching the forecast and displaying it as a {@link ListView} layout. 
*/ 





    public class ForecastFragment extends Fragment { 

    private ArrayAdapter<String> mForecastAdapter; 

    public ForecastFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     // Create some dummy data for the ListView. Here's a sample weekly forecast 
     String[] data = { 
       "Mon 6/23 - Sunny - 31/17", 
       "Tue 6/24 - Foggy - 21/8", 
       "Wed 6/25 - Cloudy - 22/17", 
       "Thurs 6/26 - Rainy - 18/11", 
       "Fri 6/27 - Foggy - 21/10", 
       "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18", 
       "Sun 6/29 - Sunny - 20/7" 
     }; 
     List<String> weekForecast = new ArrayList<String>(Arrays.asList(data)); 

     // Now that we have some dummy forecast data, create an ArrayAdapter. 
     // The ArrayAdapter will take data from a source (like our dummy forecast) and 
     // use it to populate the ListView it's attached to. 
     mForecastAdapter = 
       new ArrayAdapter<String>(
         getActivity(), // The current context (this activity) 
         R.layout.list_item_forecast, // The name of the layout ID. 
         R.id.list_item_forecast_textview, // The ID of the textview to populate. 
         weekForecast); 

     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     // Get a reference to the ListView, and attach this adapter to it. 
     ListView listView = (ListView) rootView.findViewById(R.id.listview_forecast); 
     listView.setAdapter(mForecastAdapter); 

     return rootView; 
    } 

    public class FetchWeatherTask extends AsyncTask<Void, Void, Void> { 

     private final String LOG_TAG = FetchWeatherTask.class.getSimpleName(); 

     @Override 
     protected Void doInBackground(Void... params) { 
      // These two need to be declared outside the try/catch 
      // so that they can be closed in the finally block. 
      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 

      // Will contain the raw JSON response as a string. 
      String forecastJsonStr = null; 

      try { 
       // Construct the URL for the OpenWeatherMap query 
       // Possible parameters are avaiable at OWM's forecast API page, at 
       // http://openweathermap.org/API#forecast 
       String baseUrl = "http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7"; 
       String apiKey = "&APPID=" + BuildConfig.OPEN_WEATHER_MAP_API_KEY; 
       URL url = new URL(baseUrl.concat(apiKey)); 

       // Create the request to OpenWeatherMap, and open the connection 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setRequestMethod("GET"); 
       urlConnection.connect(); 

       // Read the input stream into a String 
       InputStream inputStream = urlConnection.getInputStream(); 
       StringBuffer buffer = new StringBuffer(); 
       if (inputStream == null) { 
        // Nothing to do. 
        return null; 
       } 
       reader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
        // But it does make debugging a *lot* easier if you print out the completed 
        // buffer for debugging. 
        buffer.append(line + "\n"); 
       } 

       if (buffer.length() == 0) { 
        // Stream was empty. No point in parsing. 
        return null; 
       } 
       forecastJsonStr = buffer.toString(); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "Error ", e); 
       // If the code didn't successfully get the weather data, there's no point in attemping 
       // to parse it. 
       return null; 
      } finally { 
       if (urlConnection != null) { 
        urlConnection.disconnect(); 
       } 
       if (reader != null) { 
        try { 
         reader.close(); 
        } catch (final IOException e) { 
         Log.e(LOG_TAG, "Error closing stream", e); 
        } 
       } 
      } 
      return null; 
     } 
    } 
} 

Hier ist das Haupttätigkeitscode

package com.example.android.sunshine.app; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 


    public class MainActivity extends ActionBarActivity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      if (savedInstanceState == null) { 
       getSupportFragmentManager().beginTransaction() 
         .add(R.id.container, new ForecastFragment()) 
         .commit(); 
      } 
     } 

     @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); 
     } 


    } 

Hier ist die Fragment_main XML-Datei Fehler auf dieser Linie Tools ist: context = "MainActivity $ ForecastFragment"> es sagt ForecastFragment nicht Symbol auflösen kann. Nur der ForecastFragment-Teil ist rot.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingLeft="@dimen/activity_horizontal_margin" 

      android:paddingRight="@dimen/activity_horizontal_margin" 
      android:paddingTop="@dimen/activity_vertical_margin" 
      android:paddingBottom="@dimen/activity_vertical_margin" 
      tools:context=".MainActivity$ForecastFragment"> 

    <ListView 
     android:id="@+id/listview_forecast" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout> 

Antwort

0
tools:context=".MainActivity$ForecastFragment" 

Die Codezeile in Ihrem XML ist rot, weil ForecastFragment nicht eine innere Klasse von MainActivity ist. Dies wirkt sich nicht auf den Ausführungscode aus, da das tools: context-Attribut nur von der IDE verwendet wird, um zu bestimmen, welches Thema in der Layoutvorschau/im Editor angezeigt werden soll.

Nachfolgend finden Sie die Erklärung von http://tools.android.com/tech-docs/tools-attributes

Werkzeugen: Kontext

Dieses Attribut normalerweise auf dem Root-Elemente in einem Layout XML Datei und Aufzeichnungen, die Aktivität das Layout verknüpft ist gesetzt (bei Designtime, da offensichtlich ein Layout von mehr als einem Layout verwendet werden kann). Dies wird beispielsweise vom Layout-Editor verwendet, um ein Standardthema zu erraten, da Themen im Manifest definiert sind und mit Aktivitäten verknüpft sind, nicht Layouts.