【发布时间】:2020-01-15 12:02:42
【问题描述】:
我查看了类似的问题,但没有人帮助我
我里面有 1 个活动和 2 个片段
第一个片段包含电影列表,第二个 - qr-scanner
如果我扫描二维码,片段由他们自己更改,列表片段返回前景
如果 QR 码包含新电影 - 它将被添加到列表中(它可以正常工作)
如果 QR 码包含已存在的电影 - 我需要显示小吃吧
我的问题 - 当我尝试用
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.appolinary.msapphometask, PID: 20992
java.lang.IllegalArgumentException: No suitable parent found from the given view. Please provide a valid view.
at com.google.android.material.snackbar.Snackbar.make(Snackbar.java:181)
at com.appolinary.msapphometask.presentation.view.AllMoviesFragment.showSnackbar(AllMoviesFragment.java:113)
二维码扫描片段
public class QRReaderFragment extends Fragment {
private final String TAG = "MSApp";
private BarcodeView barcodeView;
private final int PERMISSIONS_REQUEST_ACCESS_CAMERA = 0;
private View view;
private OnQRReaderListener qrReaderListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_qrreader, container, false);
if (Objects.requireNonNull(getActivity()).checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA},
PERMISSIONS_REQUEST_ACCESS_CAMERA);
} else {
barcodeView = view.findViewById(R.id.barcode_scanner);
barcodeView.decodeContinuous(callback);
}
qrReaderListener = (OnQRReaderListener) getActivity();
return view;
}
private BarcodeCallback callback = new BarcodeCallback() {
@Override//TODO need to check bar-code for validity and prevent crash of application
public void barcodeResult(BarcodeResult result) {
if (result.getText() != null) {
barcodeView.pause();
String tag_string = result.getText();
MovieDetails movie = new Gson().fromJson(tag_string, MovieDetails.class);
returnToMovieList(movie);
Log.d(TAG,"resuming scanner, data needed was not found");
barcodeView.resume();
}
}
}
};
private void returnToMovieList(MovieDetails movie) {
qrReaderListener.dataReceived(movie);
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
}
public interface OnQRReaderListener{
void dataReceived(MovieDetails movie);
}
}
列表片段
public class AllMoviesFragment extends Fragment implements RecyclerViewAdapter.OnRecyclerViewItemClickListener,
MovieListActivity.SnackbarLauncher {
private static final String CURR_MOVIE = "Current Movie";
private static final String TAG = "MSApp";
View resultView;
RecyclerView recyclerView;
Button qrButton;// will lead us to QR Scanner
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
resultView = inflater.inflate(R.layout.fragment_all_movies, container, false);
recyclerView = resultView.findViewById(R.id.recycler_view);
qrButton = resultView.findViewById(R.id.button_qr);
qrButton.setOnClickListener(v -> {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
Fragment qrScannerFragment = new QRReaderFragment();
String tag = "QRScanner";
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_container, qrScannerFragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
});
@Override
public void showSnackbar() {
Log.d(TAG, "showSnackbar: this.getView() == null ? " + (this.getView()));
Log.d(TAG, "showSnackbar: resultView == null ? " + (resultView == null));
final LinearLayout linearLayout = resultView.findViewById(R.id.fragment_all_movies);
View view = resultView.findViewById(android.R.id.content);
Snackbar.make(view, getResources().getString(R.string.movie_exists), Snackbar.LENGTH_LONG);
}
}
活动
public class MovieListActivity extends AppCompatActivity implements QRReaderFragment.OnQRReaderListener {
String tag = "MovieList";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movie_list);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment allMoviesFragment = new AllMoviesFragment();
transaction.replace(R.id.main_container, allMoviesFragment, tag);
transaction.commit();
}
@Override
public void dataReceived(MovieDetails movie) {
Toast.makeText(this, movie.toString(), Toast.LENGTH_LONG).show();
DatabaseHelper db = App.getAppInstance().getDatabaseInstance();
MovieDetails tempMovie = db.getMovieDao().getMovieByName(movie.getTitle());
if (tempMovie == null) {
Log.d(TAG, "dataReceived: point1");
db.getMovieDao().insert(movie);
} else {//comparing only by title here!!!
FragmentManager fragmentManager = getSupportFragmentManager();
AllMoviesFragment allMoviesFragment = (AllMoviesFragment) fragmentManager.findFragmentByTag(tag);
allMoviesFragment.showSnackbar();
}
}
}
它在行中崩溃
Snackbar.make(view, getResources().getString(R.string.movie_exists), Snackbar.LENGTH_LONG);
我尝试使用 resultView(来自 onCreateView 方法),我尝试使用 findViewById(android.R.id.content) - 它们都不为空但没有成功
【问题讨论】:
标签: android android-fragments fragment illegalargumentexception snackbar