First, My English writing skill isn't good. (Because I'm korean) But I can read. so don't worry when you answer my question.
'DetailFragment.class' has problem that onLoadFinished() isn't called.
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.ShareActionProvider;
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.ImageView;
import android.widget.TextView;
import org.androidtown.sunshine.data.WeatherContract;
public class DetailFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String[] DETAIL_COLUMNS = {
WeatherContract.WeatherEntry.TABLE_NAME + "." + WeatherContract.WeatherEntry._ID,
WeatherContract.WeatherEntry.COLUMN_DATE,
WeatherContract.WeatherEntry.COLUMN_SHORT_DESC,
WeatherContract.WeatherEntry.COLUMN_MAX_TEMP,
WeatherContract.WeatherEntry.COLUMN_MIN_TEMP,
WeatherContract.WeatherEntry.COLUMN_HUMIDITY,
WeatherContract.WeatherEntry.COLUMN_WIND_SPEED,
WeatherContract.WeatherEntry.COLUMN_DEGREES,
WeatherContract.WeatherEntry.COLUMN_PRESSURE,
WeatherContract.WeatherEntry.COLUMN_WEATHER_ID,
WeatherContract.LocationEntry.COLUMN_LOCATION_SETTING
};
private static final int COL_WEATHER_ID = 0;
private static final int COL_WEATHER_DATE = 1;
private static final int COL_WEATHER_DESC = 2;
private static final int COL_WEATHER_MAX_TEMP = 3;
private static final int COL_WEATHER_MIN_TEMP = 4;
private static final int COL_WEATHER_HUMIDITY = 5;
private static final int COL_WEATHER_WIND_SPEED = 6;
private static final int COL_WEATHER_DEGREES = 7;
private static final int COL_WEATHER_PRESSURE = 8;
private static final int COL_WEATHER_CONDITION_ID = 9;
static final String DETAIL_URI = "URI";
private final String HASH_TAG = "#SunshineApp";
private final String LOG_TAG = DetailActivity.class.getSimpleName();
private final int DETAIL_LOADER = 0;
private ShareActionProvider mShareActionProvider;
private String mForecast;
private Uri mUri;
private TextView mFriendlyDateView;
private TextView dayView;
private TextView descView;
private TextView highView;
private TextView lowView;
private ImageView iconView;
private TextView humidityView;
private TextView windView;
private TextView pressureView;
public DetailFragment() {
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
getLoaderManager().initLoader(DETAIL_LOADER, null, this);
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle arguments = getArguments();
if (arguments != null) {
mUri = arguments.getParcelable(DetailFragment.DETAIL_URI);
}
View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
mFriendlyDateView = (TextView) rootView.findViewById(R.id.detail_item_date_textview);
dayView = (TextView) rootView.findViewById(R.id.detail_item_day_textview);
descView = (TextView) rootView.findViewById(R.id.detail_item_forecast_textview);
highView = (TextView) rootView.findViewById(R.id.detail_item_max_textview);
lowView = (TextView) rootView.findViewById(R.id.detail_item_min_textview);
windView = (TextView) rootView.findViewById(R.id.detail_item_wind_textview);
humidityView = (TextView) rootView.findViewById(R.id.detail_item_humidity_textview);
pressureView = (TextView) rootView.findViewById(R.id.detail_item_pressure_textview);
iconView = (ImageView) rootView.findViewById(R.id.detail_item_icon_imageview);
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.detail, menu);
MenuItem item = menu.findItem(R.id.action_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
if(mForecast != null) {
mShareActionProvider.setShareIntent(createShareForecastIntent());
}
}
private Intent createShareForecastIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, mForecast + HASH_TAG);
return shareIntent;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
startActivity(new Intent(getActivity(), SettingActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
public void onLocationChanged(String newLocation) {
Uri uri = mUri;
if (uri != null) {
long date = WeatherContract.WeatherEntry.getDateFromUri(uri);
Uri updateUri = WeatherContract.WeatherEntry.buildWeatherLocationWithDate(newLocation, date);
mUri = updateUri;
getLoaderManager().restartLoader(DETAIL_LOADER, null, this);
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (mUri != null) {
return new CursorLoader(getActivity(),
mUri,
DETAIL_COLUMNS,
null, null, null);
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if (cursor != null && cursor.moveToFirst()) {
long date = cursor.getLong(COL_WEATHER_DATE);
String friendlyDateText = Utility.getDayName(getActivity(), date);
String dateText = Utility.getFormattedMonthDay(getActivity(), date);
mFriendlyDateView.setText(friendlyDateText);
dayView.setText(dateText);
String description = cursor.getString(COL_WEATHER_DESC);
descView.setText(description);
boolean isMetric = Utility.isMetric(getActivity());
String high = Utility.formatTemperature(getActivity(),
cursor.getDouble(COL_WEATHER_MAX_TEMP), isMetric);
String low = Utility.formatTemperature(getActivity(),
cursor.getDouble(COL_WEATHER_MIN_TEMP), isMetric);
highView.setText(high);
lowView.setText(low);
float humidity = cursor.getFloat(COL_WEATHER_HUMIDITY);
humidityView.setText(getString(R.string.format_humidity, humidity));
float windSpeed = cursor.getFloat(COL_WEATHER_WIND_SPEED);
float windDirStr = cursor.getFloat(COL_WEATHER_DEGREES);
windView.setText(Utility.getFormattedWind(getActivity(), windSpeed, windDirStr));
float pressure = cursor.getFloat(COL_WEATHER_PRESSURE);
pressureView.setText(getString(R.string.format_pressure, pressure));
mForecast = String.format("%s - %s - %s/%s", dateText, description, high, low);
iconView.setImageResource(Utility.getArtResourceForWeatherCondition(cursor.getInt(COL_WEATHER_CONDITION_ID)));
}
if (mShareActionProvider != null) {
mShareActionProvider.setShareIntent(createShareForecastIntent());
}
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
}
And ForecastFragment.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
final Bundle savedInstanceState) {
mForecastAdapter = new ForecastAdapter(getActivity(), null, 0);
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
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) {
Cursor cursor = (Cursor) parent.getItemAtPosition(position);
if (cursor != null) {
String locationSetting = Utility.getPreferredLocation(getActivity());
((Callback) getActivity()).onItemSelected(
WeatherContract.WeatherEntry.buildWeatherLocationWithDate(
locationSetting, cursor.getLong(COL_WEATHER_DATE)));
}
mPosition = position;
}
});
if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) {
mPosition = savedInstanceState.getInt(SELECTED_KEY);
}
return rootView;
}
onItemSelected method in MainActivity.
@Override
public void onItemSelected(Uri contentUri) {
if (mTwoPane) {
Bundle args = new Bundle();
args.putParcelable(DetailFragment.DETAIL_URI, contentUri);
DetailFragment fragment = new DetailFragment();
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.replace(R.id.weather_detail_container, fragment, DETAILFRAGMENT_TAG)
.commit();
} else {
Intent intent = new Intent(this, DetailActivity.class).setData(contentUri);
startActivity(intent);
}
}
If you want more codes, visit here. https://github.com/DrLuminous/Sunshine-YJ
I don't know what caused the problem. I didn't edit any codes since I launched app successfully. Only I edit layout files to implement layout aliasing. but not java files.
Do you know what's the matters?
Aucun commentaire:
Enregistrer un commentaire