我的详细活动布局屏幕有问题。屏幕上将显示详细信息,但此后屏幕加载不会停止。显示屏幕中的详细信息后,我需要帮助来停止屏幕加载。
主布局活动会加载一定的时间,并且工作正常,但详细活动布局会继续加载而不停止。
DetailsFragment.java
public class DetailsFragment extends Fragment {
private static final String LOG_TAG = DetailsFragment.class.getSimpleName();
private static final String ARG_NEWS = "arg_news";
private static final String SAVE_NEWS = "save_news";
private static final String SAVE_FAVORITE_NEWS = "save_favorite_news";
private static final String SAVE_FAVORITE_SORT = "save_favorite_sort";
private static final String SAVE_FULLY_LOADED = "save_fully_loaded";
private static final String SAVE_SHARE_MENU_VISIBILITY = "save_share_menu_visibility";
private final ResponseReceiver mReceiver = new ResponseReceiver();
private Context mContext;
private News mNews;
private ShareActionProvider mShareActionProvider;
private MenuItem mShareMenuItem;
private ImageView mPosterImageView;
private OnLoadingFragmentListener mLoadingListener;
private boolean mIsFavoriteNews;
private boolean mIsFavoriteSort;
private boolean mIsFullyLoaded;
private boolean mIsShareMenuItemVisible;
public DetailsFragment() {
// Required empty public constructor
}
// Create new Fragment instance
public static DetailsFragment newInstance(News newsSelected) {
DetailsFragment fragment = new DetailsFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_NEWS, newsSelected);
fragment.setArguments(args);
return fragment;
}
public static DetailsFragment newInstance() {
DetailsFragment fragment = new DetailsFragment();
return fragment;
}
// Listener to handle star button clicks. This button adds and remove news from
// content provider
private final View.OnClickListener mStarButtonOnClickListener = new View.OnClickListener() {
public void onClick(View view) {
// Can't save it to favorites db if news poster is not ready yet
if (mPosterImageView != null && !Utils.hasImage(mPosterImageView)) {
Toast.makeText(mContext, R.string.please_wait_poster_download,
Toast.LENGTH_SHORT).show();
return;
}
if (mIsFavoriteNews) {
if (removeFavoriteNews(mNews) > 0) {
Toast.makeText(mContext, R.string.success_remove_favorites, Toast
.LENGTH_SHORT)
.show();
((ImageButton) view).setImageResource(R.drawable.ic_star_border);
// Delete poster image stored in internal storage
Utils.deleteFileFromInternalStorage(mContext, mNews.getTitle());
mIsFavoriteNews = false;
} else {
Toast.makeText(mContext, R.string.fail_remove_favorites,
Toast.LENGTH_SHORT).show();
}
} else {
if (addFavoriteNews(mNews) != null) {
Toast.makeText(mContext, R.string.success_add_favorites, Toast
.LENGTH_SHORT).show();
((ImageButton) view).setImageResource(R.drawable.ic_star);
// Save poster image to internal storage
Bitmap posterBitmap = Utils.getBitmapFromImageView(mPosterImageView);
Utils.saveBitmapToInternalStorage(mContext, posterBitmap, mNews.getTitle());
mIsFavoriteNews = true;
} else {
Toast.makeText(mContext, R.string.fail_add_favorites, Toast
.LENGTH_SHORT).show();
}
}
}
};
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnLoadingFragmentListener) {
mLoadingListener = (OnLoadingFragmentListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnLoadingInteractionListener");
}
mContext = context;
}
@Override
public void onDetach() {
super.onDetach();
mLoadingListener = null;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mNews = getArguments().getParcelable(ARG_NEWS);
mIsFavoriteNews = isFavoriteNews(mContext, mNews);
mIsFavoriteSort = Utils.isFavoriteSort(mContext);
}
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.details_menu, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
mShareMenuItem = menu.findItem(R.id.menu_item_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider
(mShareMenuItem);
setShareMenuItemAction();
super.onPrepareOptionsMenu(menu);
}
private void setShareMenuItemAction() {
if (mNews != null ) {
//String videoKey = mNews.getVideos()[0].getKey();
if (mShareActionProvider != null
&& mShareMenuItem != null) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
mShareActionProvider.setShareIntent(shareIntent);
mShareMenuItem.setVisible(true);
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(SAVE_NEWS, mNews);
outState.putBoolean(SAVE_FAVORITE_NEWS, mIsFavoriteNews);
outState.putBoolean(SAVE_FAVORITE_SORT, mIsFavoriteSort);
outState.putBoolean(SAVE_FULLY_LOADED, mIsFullyLoaded);
outState.putBoolean(SAVE_SHARE_MENU_VISIBILITY, mIsShareMenuItemVisible);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mNews == null) {
return null;
}
// Restore objects value
if (savedInstanceState != null) {
mNews = savedInstanceState.getParcelable(SAVE_NEWS);
mIsFavoriteNews = savedInstanceState.getBoolean(SAVE_FAVORITE_NEWS);
mIsFavoriteSort = savedInstanceState.getBoolean(SAVE_FAVORITE_SORT);
mIsFullyLoaded = savedInstanceState.getBoolean(SAVE_FULLY_LOADED);
mIsShareMenuItemVisible = savedInstanceState.getBoolean(SAVE_SHARE_MENU_VISIBILITY);
}
View view = inflater.inflate(R.layout.fragment_details, container, false);
mPosterImageView = (ImageView) view.findViewById(R.id.news_img);
Glide.with(mContext).load(mNews.getImageUri())
.dontAnimate().into(mPosterImageView);
TextView titleView = (TextView) view.findViewById(R.id.title_content);
titleView.setText(mNews.getTitle());
TextView publishDateView = (TextView) view.findViewById(R.id.publish_date_content);
String date = Utils.formatDateForLocale(mNews.getPublishedDate());
publishDateView.setText(date);
TextView author = (TextView) view.findViewById(R.id.author_name);
author.setText(mNews.getAuthor());
TextView descriptionView = (TextView) view.findViewById(R.id.description_content);
TextView fullNewsUrl = (TextView) view.findViewById(R.id.news_full);
fullNewsUrl.setText(mNews.getFullNewsUrl());
// In portuguese, some news does not contain overview data. In that case, displays
// default text: @string/overview_not_available
if (!TextUtils.isEmpty(mNews.getDescription())) {
descriptionView.setText(mNews.getDescription());
}
ImageButton starButton = (ImageButton) view.findViewById(R.id.star_button);
starButton.setOnClickListener(mStarButtonOnClickListener);
if (mIsFavoriteNews) {
starButton.setImageResource(R.drawable.ic_star);
} else {
starButton.setImageResource(R.drawable.ic_star_border);
}
starButton.setVisibility(View.VISIBLE);
FrameLayout detailFrame = (FrameLayout) view.findViewById(R.id.detail_frame);
detailFrame.setVisibility(View.VISIBLE);
return view;
}
// Method that adds a News to content provider
private Uri addFavoriteNews(News news) {
Uri newsReturnUri = null;
try {
ContentValues newsContentValues = createNewsValues(news);
newsReturnUri = mContext.getContentResolver().insert(FavoriteNewsContract
.NewsEntry
.CONTENT_URI, newsContentValues);
} catch (SQLException e) {
Log.d(LOG_TAG, "SQLException while adding news to Favorite db");
e.printStackTrace();
}
return newsReturnUri;
}
// Method that removes a News from content provider
private int removeFavoriteNews(News news) {
int newsRemoved = mContext.getContentResolver().delete(FavoriteNewsContract
.NewsEntry.CONTENT_URI,
FavoriteNewsContract
.NewsEntry._ID + " = ?", new String[]{news.getTitle()});
return newsRemoved;
}
// Create news content values
private ContentValues createNewsValues(News news) {
ContentValues newsContentValues = new ContentValues();
// newsContentValues.put(FavoriteNewsContract.NewsEntry._ID, Integer.parseInt(news
// .getId()));
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_TITLE, news.getTitle());
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_PUBLISH_DATE, news
.getPublishedDate());
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_AUTHOR, news
.getAuthor());
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_DESCRIPTION, news
.getDescription());
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_FULL_NEWS_URL, news
.getFullNewsUrl());
newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_IMG_URL, news
.getImageUri()
.toString());
return newsContentValues;
}
// Method that query content provider and checks whether is a Favorite news or not
private boolean isFavoriteNews(Context ctx, News news) {
String newsID = news.getTitle();
Cursor cursor = ctx.getContentResolver().query(FavoriteNewsContract.NewsEntry
.CONTENT_URI, null,
FavoriteNewsContract.NewsEntry._ID + " = " + newsID, null, null);
if (cursor != null && cursor.moveToNext()) {
int newsIdColumnIndex = cursor.getColumnIndex(FavoriteNewsContract.NewsEntry._ID);
if (TextUtils.equals(newsID, cursor.getString(newsIdColumnIndex))) {
return true;
}
}
if (cursor != null) {
cursor.close();
}
return false;
}
@Override
public void onResume() {
super.onResume();
if (mNews != null) {
if (mReceiver != null) {
LocalBroadcastManager.getInstance(mContext)
.registerReceiver(mReceiver, new IntentFilter(Constants
.ACTION_EXTRA_INFO_RESULT));
}
if (!mIsFullyLoaded && !mIsFavoriteSort) {
Intent intent = new Intent(mContext, NewsIntentService.class);
intent.setAction(Constants.ACTION_EXTRA_INFO_REQUEST);
intent.putExtra(NewsIntentService.EXTRA_INFO_NEWS_ID, mNews.getTitle());
mContext.startService(intent);
if (mLoadingListener != null) {
mLoadingListener.onLoadingDisplay(true, true);
}
}
}
}
@Override
public void onPause() {
super.onPause();
if (mReceiver != null) {
LocalBroadcastManager.getInstance(mContext).unregisterReceiver(mReceiver);
}
}
// BroadcastReceiver for network call
public class ResponseReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getAction() == null) {
return;
}
if (intent.getAction().equals(Constants.ACTION_EXTRA_INFO_RESULT)) {
setShareMenuItemAction();
} else {
Toast.makeText(mContext, R.string.toast_failed_to_retrieve_data,
Toast.LENGTH_SHORT).show();
}
if (mLoadingListener != null) {
mLoadingListener.onLoadingDisplay(true, false);
}
mIsFullyLoaded = true;
}
}
}
DetailsActivity.java
public class DetailsActivity extends AppCompatActivity implements OnLoadingFragmentListener {
private static final String LOG_TAG = DetailsActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
if (savedInstanceState == null) {
Intent intent = getIntent();
if (intent != null && intent.hasExtra(Constants.EXTRA_NEWS)) {
News news = intent
.getParcelableExtra(Constants.EXTRA_NEWS);
DetailsFragment detailsFragment = DetailsFragment.newInstance(news);
getSupportFragmentManager().beginTransaction()
.add(R.id.details_fragment_container, detailsFragment).commit();
} else {
Log.d(LOG_TAG, "Something went wrong. Intent doesn't have Constants.EXTRA_NEWS" +
" extra. Finishing DetailsActivity.");
finish();
}
}
}
@Override
public void onLoadingDisplay(boolean fromDetails, boolean display) {
Fragment loadingFragment = getSupportFragmentManager()
.findFragmentByTag(LoadingFragment.FRAGMENT_TAG);
if (display && loadingFragment == null) {
loadingFragment = LoadingFragment.newInstance();
if (fromDetails) {
getSupportFragmentManager().beginTransaction()
.add(R.id.details_fragment_container,
loadingFragment, LoadingFragment.FRAGMENT_TAG).commit();
} else {
getSupportFragmentManager().beginTransaction()
.add(R.id.news_fragment_container,
loadingFragment, LoadingFragment.FRAGMENT_TAG).commit();
}
} else if (!display && loadingFragment != null) {
getSupportFragmentManager().beginTransaction()
.remove(loadingFragment).commit();
}
}
}
LoadingFragment.xml
public class LoadingFragment extends Fragment {
public static final String FRAGMENT_TAG = LoadingFragment.class.getSimpleName();
private static final String LOG_TAG = LoadingFragment.class.getSimpleName();
public LoadingFragment() {
// Required empty public constructor
}
public static LoadingFragment newInstance() {
LoadingFragment fragment = new LoadingFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_loading, container, false);
return view;
}
}
fragment_loading.xml
<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:background="@color/semiTransparentBlack"
android:clickable="true"
tools:context=".ui.LoadingFragment">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center" />
</FrameLayout>
答案 0 :(得分:0)
使用onDestroy
@Override
public void onDestroy() {
super.onDestroy();
mLoadingListener = null;
}
,您还应该删除ResponseReceiver
if (mLoadingListener != null) {
mLoadingListener.onLoadingDisplay(true, false);
}
答案 1 :(得分:0)
您很有可能需要在适当的时间将加载View
(ProgressBar
?)的可见性更改为INVISIBLE
或GONE
,可能是在加载完成时。
如果加载的View
包含在某种对话框中,则您需要在适当的时间将其消除。