2016-05-25 24 views
-1

MainActivity.java私のcontent_detail.xmlにアクションバーが表示されないのはなぜですか?

package com.example.android.sunshine.app; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
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); 
    } 

} 

Forecastfragment.java

package com.example.android.sunshine.app; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.text.format.Time; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

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

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.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

/** 
* Created by smanohar on 5/11/2016. 
*/ 
public class ForecastFragment extends Fragment { 

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

    ArrayAdapter<String> mForecastAdapter; 

    public ForecastFragment() { 
    } 


    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ 
     inflater.inflate(R.menu.forecastfragment, menu); 
    } 

    public boolean onOptionsItemSelected(MenuItem item){ 
     int id = item.getItemId(); 
     if(id == R.id.action_refresh){ 
      FetchWeatherTask weatherTask = new FetchWeatherTask(); 
      weatherTask.execute("94043"); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

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

     String[] forecastArray = {"Today - Sunny 88/63", 
       "Tomorrow - Sunny 70/64", 
       "Sunday - Sunny 80/64", 
       "Monday - Sunny 99/70", 
       "Tuesday - Sunny 89/64", 
       "Wednesday - Sunny 88/65", 
       "Thursday - Sunny 99/76", 
       "Friday - Sunny 87/89", 
       "Saturday - Sunny 87/79" 
     }; 

     List<String> weekForecast = new ArrayList<String>(Arrays.asList(forecastArray)); 

     mForecastAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast, R.id.list_item_forecast_textview,weekForecast); 

     ListView listView = (ListView) rootView.findViewById(R.id.listView_forecast); 

     listView.setAdapter(mForecastAdapter); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String forecast = mForecastAdapter.getItem(position); 
       Intent viewEachWeatherIntent = new Intent(getContext(),DetailActivity.class) 
         .putExtra(Intent.EXTRA_TEXT, forecast); 
       startActivity(viewEachWeatherIntent); 
       // Toast.makeText(getActivity(), forecast, Toast.LENGTH_SHORT).show(); 

      } 
     }); 
     return rootView; 

    } 

    /* The date/time conversion code is going to be moved outside the asynctask later, 
     * so for convenience we're breaking it out into its own method now. 
     */ 
    private String getReadableDateString(long time){ 
     // Because the API returns a unix timestamp (measured in seconds), 
     // it must be converted to milliseconds in order to be converted to valid date. 
     SimpleDateFormat shortenedDateFormat = new SimpleDateFormat("EEE MMM dd"); 
     return shortenedDateFormat.format(time); 
    } 

    /** 
    * Prepare the weather high/lows for presentation. 
    */ 
    private String formatHighLows(double high, double low) { 
     // For presentation, assume the user doesn't care about tenths of a degree. 
     long roundedHigh = Math.round(high); 
     long roundedLow = Math.round(low); 

     String highLowStr = roundedHigh + "/" + roundedLow; 
     return highLowStr; 
    } 

    /** 
    * Take the String representing the complete forecast in JSON Format and 
    * pull out the data we need to construct the Strings needed for the wireframes. 
    * 
    * Fortunately parsing is easy: constructor takes the JSON string and converts it 
    * into an Object hierarchy for us. 
    */ 
    private String[] getWeatherDataFromJson(String forecastJsonStr, int numDays) 
      throws JSONException { 

     // These are the names of the JSON objects that need to be extracted. 
     final String OWM_LIST = "list"; 
     final String OWM_WEATHER = "weather"; 
     final String OWM_TEMPERATURE = "temp"; 
     final String OWM_MAX = "max"; 
     final String OWM_MIN = "min"; 
     final String OWM_DESCRIPTION = "main"; 

     JSONObject forecastJson = new JSONObject(forecastJsonStr); 
     JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST); 

     // OWM returns daily forecasts based upon the local time of the city that is being 
     // asked for, which means that we need to know the GMT offset to translate this data 
     // properly. 

     // Since this data is also sent in-order and the first day is always the 
     // current day, we're going to take advantage of that to get a nice 
     // normalized UTC date for all of our weather. 

     Time dayTime = new Time(); 
     dayTime.setToNow(); 

     // we start at the day returned by local time. Otherwise this is a mess. 
     int julianStartDay = Time.getJulianDay(System.currentTimeMillis(), dayTime.gmtoff); 

     // now we work exclusively in UTC 
     dayTime = new Time(); 

     String[] resultStrs = new String[numDays]; 
     for(int i = 0; i < weatherArray.length(); i++) { 
      // For now, using the format "Day, description, hi/low" 
      String day; 
      String description; 
      String highAndLow; 

      // Get the JSON object representing the day 
      JSONObject dayForecast = weatherArray.getJSONObject(i); 

      // The date/time is returned as a long. We need to convert that 
      // into something human-readable, since most people won't read "1400356800" as 
      // "this saturday". 
      long dateTime; 
      // Cheating to convert this to UTC time, which is what we want anyhow 
      dateTime = dayTime.setJulianDay(julianStartDay+i); 
      day = getReadableDateString(dateTime); 

      // description is in a child array called "weather", which is 1 element long. 
      JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0); 
      description = weatherObject.getString(OWM_DESCRIPTION); 

      // Temperatures are in a child object called "temp". Try not to name variables 
      // "temp" when working with temperature. It confuses everybody. 
      JSONObject temperatureObject = dayForecast.getJSONObject(OWM_TEMPERATURE); 
      double high = temperatureObject.getDouble(OWM_MAX); 
      double low = temperatureObject.getDouble(OWM_MIN); 

      highAndLow = formatHighLows(high, low); 
      resultStrs[i] = day + " - " + description + " - " + highAndLow; 
     } 

     for (String s : resultStrs) { 
      Log.v(LOG_TAG, "Forecast entry: " + s); 
     } 
     return resultStrs; 

    } 


public class FetchWeatherTask extends AsyncTask<String, Void, String[]> { 

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

     @Override 
     protected String[] doInBackground(String... 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; 
      String format = "json"; 
      String units = "metric"; 
      int numDays = 7; 
      String apiKey = "4fc1fba049dd6070aa4425a94a12fec7"; 

      try { 
       // Construct the URL for the OpenWeatherMap query 
       // Possible parameters are avaiable at OWM's forecast API page, at 
       // http://openweathermap.org/API#forecast 
       final String FORECAST_BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?"; 
       final String QUERY_PARAM = "q"; 
       final String FORMAT_PARAM = "mode"; 
       final String UNITS_PARAM = "units"; 
       final String DAYS_PARAM = "cnt"; 
//    final String apiKey = "&APPID=" + ; 

       Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon() 
         .appendQueryParameter(QUERY_PARAM, params[0]) 
         .appendQueryParameter(FORMAT_PARAM, format) 
         .appendQueryParameter(UNITS_PARAM, units) 
         .appendQueryParameter(DAYS_PARAM, Integer.toString(numDays)) 
         .appendQueryParameter("APPID" , apiKey) 
         .build(); 


       URL url = new URL(builtUri.toString()); 

       Log.v(LOG_TAG, "Built URI " + builtUri.toString()); 

       // 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(); 

       Log.v(LOG_TAG, "Forecast JSON String: " + forecastJsonStr); 

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

      } 

      try{ 
       return getWeatherDataFromJson(forecastJsonStr, numDays); 
      }catch(JSONException e){ 
       Log.e(LOG_TAG, e.getMessage(), e); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

    @Override 
    protected void onPostExecute(String[] result) { 
     if(result != null){ 
      mForecastAdapter.clear(); 
      for(String dayForecastStr: result){ 
       mForecastAdapter.add(dayForecastStr); 
      } 

     } 
    } 
} 
} 

DetailActivity.java

package com.example.android.sunshine.app; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class DetailActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail); 
     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()) 
        .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.detail, 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); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      Intent intent = getActivity().getIntent(); 
      View rootView = inflater.inflate(R.layout.content_detail, container, false); 
      if(intent != null && intent.hasExtra(Intent.EXTRA_TEXT)){ 
       String forecastStr = intent.getStringExtra(Intent.EXTRA_TEXT); 
       ((TextView) rootView.findViewById(R.id.detail_text)).setText(forecastStr); 
      } 
      return rootView; 
     } 
    } 
} 

forecastfragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/action_refresh" android:title="@string/action_refresh" 
     android:orderInCategory="100" app:showAsAction="never" /> 
</menu> 

main.xml DetailActivityで

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/action_settings" android:title="@string/action_settings" 
     android:orderInCategory="100" app:showAsAction="never" /> 
</menu> 

details.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.android.sunshine.app.MainActivity"> 
    <item android:id="@+id/action_settings" android:title="@string/action_settings" 
     android:orderInCategory="100" app:showAsAction="never" /> 
</menu> 

私はアクションバーが表示されません。それを修正するには?

PS:これは私のAndroidManifest.xmlが

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.sunshine.app"> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".DetailActivity" 
      android:label="@string/title_activity_detail" 
      android:parentActivityName=".MainActivity" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.example.android.sunshine.app.MainActivity" /> 
     </activity> 
     <activity 
      android:name=".SettingsActivity" 
      android:label="@string/title_activity_settings" 
      android:parentActivityName=".DetailActivity" 
      android:theme="@style/AppTheme"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.example.android.sunshine.app.DetailActivity" /> 
     </activity> 
    </application> 

</manifest> 
+0

アクションバーの表示のみを求めているので、なぜJSON解析でフラグメントを追加する必要があるのか​​分かりません。 [mcve]を入力してください。 (あなたがAndroidで新しいと言っているので、あなたが問題を抱えている1つのアクティビティ、マニフェスト、styles.xmlです) –

+0

'app:showAsAction =" never "' '' app:showAsAction = "always" ' – am110787

+0

@ am110787 detail.xmlで変更しましたが、変更はありません。他の場所を変更しなければならないのですか? – user3705478

答えて

1

どのように見えるかであるあなたは、この

後藤リソースフォルダ - >値 - > style.xmlのように試してみて、この

のように定義することができます
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 

</style> 

マニフェストファイルに移動し、アプリケーションタグのandroid:theme = ""属性を追加します。

+0

私は2つのstyles.xmlを持っています。 1つはstyles.xmlとstyles.xml(v21)です。あなたが言ったように前者はすでにあり、後者一つは、この <スタイル名=「AppTheme.NoActionBar」> <項目名=「windowActionBar」>偽 <項目名=「windowNoTitle」>のようなものです真 <項目名=「アンドロイド:windowDrawsSystemBarBackgrounds」>真 <項目名=「アンドロイド:statusBarColor」>アンドロイド@:私はあなたの変更を加える必要があり、それがどのように解決しない色/透明 問題?助けてください 。私はアンドロイドの初心者です。 – user3705478

+0

この属性はstyle.xmlにあり、v21ではありません –

+0

style.xmlには既にそこにあります。 – user3705478

関連する問題