The
nav grpah
<?xml version="1.0" encoding="utf-8"?>
<navigation 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"
android:id="@ id/mobile_navigation"
app:startDestination="@id/nav_home">
<fragment
android:id="@ id/nav_home"
android:name="com.blogspot.abtallaldigital.ui.home.HomeFragment"
android:label="@string/home"
tools:layout="@layout/fragment_home"/>
<fragment
android:id="@ id/nav_Accessory"
android:name="com.blogspot.abtallaldigital.ui.accessory.AccessoryFragment"
android:label="@string/accessory"
tools:layout="@layout/fragment_accessory" />
<fragment
android:id="@ id/nav_Arcade"
android:name="com.blogspot.abtallaldigital.ui.arcade.ArcadeFragment"
android:label="@string/arcade"
tools:layout="@layout/fragment_arcade" />
<fragment
android:id="@ id/nav_Fashion"
android:name="com.blogspot.abtallaldigital.ui.fashion.FashionFragment"
android:label="@string/fashion"
tools:layout="@layout/fashion_fragment" />
<fragment
android:id="@ id/nav_Food"
android:name="com.blogspot.abtallaldigital.ui.food.FoodFragment"
android:label="@string/food"
tools:layout="@layout/food_fragment" />
<fragment
android:id="@ id/nav_Heath"
android:name="com.blogspot.abtallaldigital.ui.heath.HeathFragment"
android:label="@string/heath"
tools:layout="@layout/heath_fragment" />
<fragment
android:id="@ id/nav_Lifestyle"
android:name="com.blogspot.abtallaldigital.ui.lifestyle.LifestyleFragment"
android:label="@string/lifestyle"
tools:layout="@layout/lifestyle_fragment" />
<fragment
android:id="@ id/nav_Sports"
android:name="com.blogspot.abtallaldigital.ui.sports.SportsFragment"
android:label="@string/sports"
tools:layout="@layout/sports_fragment" />
<dialog
android:id="@ id/about"
android:name="com.blogspot.abtallaldigital.ui.about.AboutFragment"
android:label="about"
tools:layout="@layout/about" />
<activity
android:id="@ id/detailsActivity"
android:name="com.blogspot.abtallaldigital.ui.DetailsActivity"
android:label="activity_details"
tools:layout="@layout/activity_details" />
</navigation>
HomeFragment navigtion code
@Override
public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.homeRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(requireContext(),
binding.homeRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Item item = itemArrayList.get(position);
bundle.putParcelable("item",item);
Navigation.findNavController(requireView())
.navigate(R.id.detailsActivity, bundle,
new NavOptions.Builder()
.setPopUpTo(R.id.nav_home, true).build()
);
}
@Override
public void onLongItemClick(View view, int position) {
}
}
));
}
DetailsActivity
@AndroidEntryPoint
public class DetailsActivity extends AppCompatActivity {
private static final String TAG = "DetailsActivity";
private ActivityDetailsBinding binding;
String url, title, content, youtubeThumbnailImageSrc, youTubeLink;
int youtubeThumbnailImageSetVisibility;
private PostViewModel postViewModel;
private Item postItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityDetailsBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
postViewModel = new ViewModelProvider(this).get(PostViewModel.class);
postItem = getIntent().getParcelableExtra("item");
if (postItem != null) {
Log.d(TAG, "onItemClick: item" postItem.getTitle());
final Document document = Jsoup.parse(postItem.getContent());
Element element = document.body();
for (Element e : element.getElementsByClass
("YOUTUBE-iframe-video")) {
youtubeThumbnailImageSrc = e.attr("data-thumbnail-src");
youTubeLink = e.attr("src");
Log.e("YouTube thumbnail", youtubeThumbnailImageSrc);
Log.e("Youtube link", youTubeLink);
}
if (youtubeThumbnailImageSrc == null) {
youtubeThumbnailImageSetVisibility = 8;
}
url = postItem.getUrl();
title = postItem.getTitle();
content = postItem.getContent();
}
setSupportActionBar(binding.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
binding.progressBar.setVisibility(View.VISIBLE);
binding.titleTextView.setText(title);
binding.blogContent.setMovementMethod(LinkMovementMethod.getInstance());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
binding.fab.bringToFront();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
binding.scrollView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if (scrollY > 0 && binding.fab.isShown()) {
binding.fab.hide();
} else if (scrollY < 22) {
binding.fab.show();
}
});
} else {
binding.scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
int mScrollY = binding.scrollView.getScrollY();
if (mScrollY > 0 && binding.fab.isShown()) {
binding.fab.hide();
} else if (mScrollY < 22) {
binding.fab.show();
}
});
}
binding.fab.setOnClickListener(view -> {
String shareContent = title "\n" url;
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
try {
startActivity(Intent.createChooser(shareIntent, title));
} catch (Exception exception) {
Log.e(TAG, "onCreate: " exception);
}
});
binding.youtubeThumbnailImage.setVisibility(youtubeThumbnailImageSetVisibility);
binding.youtubeThumbnailImage.setAdjustViewBounds(true);
Picasso.get().load(youtubeThumbnailImageSrc).into(binding.youtubeThumbnailImage);
binding.youtubeThumbnailImage.setOnClickListener(view -> {
Intent youTube = new Intent
(Intent.ACTION_VIEW, Uri.parse(youTubeLink));
startActivity(youTube);
});
PicassoImageGetter imageGetter = new PicassoImageGetter(binding.blogContent, this);
Spannable html;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
html = (Spannable) Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY, imageGetter, null);
} else {
html = (Spannable) Html.fromHtml(content, imageGetter, null);
}
binding.blogContent.setText(html);
binding.visitSite.setOnClickListener(view -> openCustomTab(this, Uri.parse(url)));
binding.progressBar.setVisibility(View.GONE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_details_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_add_to_favorites) {
saveTogFavorites(item);
} else if (item.getItemId() == R.id.action_share) {
ShareActionProvider shareActionProvider =
(ShareActionProvider) MenuItemCompat.getActionProvider(item);
shareActionProvider.setShareIntent(createShareIntent());
return true;
} else if (item.getItemId() == R.id.copyTheLink) {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("link", url);
clipboardManager.setPrimaryClip(clipData);
Toast.makeText(this, getString(R.string.linkCopied), Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
private void saveTogFavorites(MenuItem menuItem) {
FavoritesEntity favoritesEntity = new FavoritesEntity(0,
postItem);
postViewModel.insertFavorites(favoritesEntity);
menuItem.setIcon(R.drawable.ic_favorite);
Snackbar.make(binding.getRoot(), "Saved", Snackbar.LENGTH_LONG).show();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
MainActivity
@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
@SuppressWarnings("unused")
private AppBarConfiguration mAppBarConfiguration;
public static Utils.DataStoreRepository DATA_STORE_REPOSITORY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
DATA_STORE_REPOSITORY = new Utils.DataStoreRepository(this);
setSupportActionBar(binding.appBarMain.toolbar);
mAppBarConfiguration = new AppBarConfiguration.Builder(R.id.nav_home, R.id.nav_Accessory,
R.id.nav_Arcade, R.id.nav_Fashion,
R.id.nav_Food, R.id.nav_Heath,
R.id.nav_Lifestyle, R.id.nav_Sports, R.id.about)
.setOpenableLayout(binding.drawerLayout)
.build();
NavHostFragment navHostFragment = (NavHostFragment)
getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
assert navHostFragment != null;
NavController navController = navHostFragment.getNavController();
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(binding.navView, navController);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
While I searching for the solution of this issue, I saw the similar question and I use viewModel with MutableLiveData
but not to handle the events
CodePudding user response:
Why do you have to create another Activity?
The default behaviour of the Navigation Component is to use one Activity and multiple Fragments.
You should create an adapter to show these datas on item and then implement on ItemClickListener interface to pass the selected item clicked from adapter to HomeFragment. From HomeFragment you can implement the interface and send the current clicked Item to DetailsFragment not DetailsActivity(which you have to change) , you can send it with args.
Do not use more than one Activity in the Navigation Component.
CodePudding user response:
you can try removing the fragment from the fragment manager like this:
Fragment fragmentByTag = getFragmentManager().
findFragmentByTag("Old fragment tag");
if (fragmentByTag != null) {
getFragmentManager().beginTransaction()
.remove(fragmentByTag).commit();
}