【问题标题】:Show snackbar in fragment from another fragment (IllegalArgumentException: No suitable parent found from the given view)在来自另一个片段的片段中显示小吃栏(IllegalArgumentException:从给定视图中找不到合适的父级)
【发布时间】: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


    【解决方案1】:

    我的错
    我忘了协调器布局:-(

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多