Reputation: 602
Since onOptionsItemSelected
i want to migrate to MenuProvider
.
After implementing interface and adding provider onMenuItemSelected wont be called when clicking on Menuitem. Only onCreateMenu is called.
It all works with the old API but the new way just does not recognize any clicks
Does anyone know what may be missing?
Code:
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
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.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;
import androidx.core.content.ContextCompat;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Objects;
public class Editor extends Fragment implements MenuProvider {
private AppCompatEditText properties;
private String getFilePath;
private Ad ad;
private String line;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
requireActivity().addMenuProvider(this);
FileTools.deselectAllFiles();
FileTools.setFileOperationPending(false);
requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
View view = inflater.inflate(R.layout.editpmyml, container, false);
ad = new Ad(requireActivity());
ad.init();
requireActivity().findViewById(R.id.card).setVisibility(View.GONE);
getFilePath = Fileexplorer.mkPath.toString();
properties = view.findViewById(R.id.cont);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
File name = new File(Fileexplorer.mkPath.toString() + "/" + ResAdapter.fileName);
String filename = name.getName();
if (savedInstanceState != null) {
savedInstanceState.clear();
}
requireActivity().setTitle(filename);
try(BufferedReader bufferedReader = new BufferedReader(new FileReader(getFilePath), 1024)){
while ((this.line = bufferedReader.readLine()) != null) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(this.line + "\n");
if (line.trim().startsWith("#")) {
try {
spannableStringBuilder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(requireActivity(), R.color.GREEN)), 0, this.line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
requireActivity().runOnUiThread(() -> getProperties().append(spannableStringBuilder));
} catch (Exception e) {
getProperties().append(this.line + "\n");
}
} else {
requireActivity().runOnUiThread(() -> getProperties().append(this.line + "\n"));
}
}
} catch (Exception ignored) {}
super.onViewCreated(view, savedInstanceState);
}
public static void dirSub(){
String nameToRemove = "/"+ new File(Fileexplorer.mkPath.toString()).getName();
Fileexplorer.mkPath.delete(Fileexplorer.mkPath.lastIndexOf("/"),Fileexplorer.mkPath.lastIndexOf("/") +nameToRemove.length());
}
@Override
public boolean onMenuItemSelected(MenuItem item) {
if (item.getItemId() == R.id.sv) {
writeFile(Objects.requireNonNull(properties.getText()).toString(), getFilePath);
}else{
dirSub();
}
return true;
}
private void writeFile(String content,String path) {
try(FileWriter fileWriter = new FileWriter(path)){
ad.showAd();
fileWriter.write(content);
fileWriter.flush();
Toast.makeText(getContext(), getString(R.string.saved), Toast.LENGTH_LONG).show();
dirSub();
requireActivity().getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).setReorderingAllowed(true).replace(R.id.mainFragment,new Fileexplorer()).commit();
} catch (Exception ignored) {
}
}
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
menu.clear();
menuInflater.inflate(R.menu.save, menu);
}
@Override
public void onPause() {
super.onPause();
requireActivity().findViewById(R.id.card).setVisibility(View.GONE);
}
@Override
public void onStop() {
requireActivity().findViewById(R.id.card).setVisibility(View.VISIBLE);
super.onStop();
}
private EditText getProperties() {
return this.properties;
}
}
Upvotes: 7
Views: 1229
Reputation: 455
Like the comment by @ianhanniballake. Maybe you have something like below code in the Activity.
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
when (menuItem.itemId) {
android.R.id.home -> finish()
}
return true // this line
}
or
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> finish()
}
return true // this line
}
return true
means you handled every menu item and not to perform other menu handling.
Replacing true
with false
in the Activity works for me.
Upvotes: 7
Reputation: 823
Just add this dependency to your app level build.gradle file. This will call onOptionsItemSelected method, that's how its worked for me.
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
Upvotes: 1