Как использовать камеру из фрагмента и отображать захваченное изображение в виде изображения на одном фрагменте? - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу отобразить захваченное изображение в моем фрагменте, но оно не отображается, например, хотя кажется, что выполняется код обратного вызова во фрагменте.

Вот моя активность -

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    // Views and Context
    private View nav_header_view;
    private Context context;

    // Widgets
    private TextView tvCompanyName, tvCompanyEmail, tvName;
    private ImageView imageView;
    private ViewPager mViewPager;
    public TabLayout tabLayout;

    // Data
    private FragmentManager manager;
    private int selectNavId;
    private ArrayList<Category> categoryArrayList = new ArrayList<>();
    private String uuId = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        setTitle("Home");
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

//        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        mViewPager = (ViewPager) findViewById(R.id.container);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);

                switch (selectNavId) {

                    case R.id.nav_search:
                        openSearchFragment();
                        break;
                    case R.id.nav_home:
                        displayTabForHomeFragment();
                        break;
                    case R.id.nav_daily_sales:
                        openDailySalesFragment();
                        break;
                    case R.id.nav_store:
                        openCompanyFragment();
                        break;
                    case R.id.nav_purchase:
                        openOrderedFragment();
                        break;
                    case R.id.nav_account:
                        openAccountFragment();
                        break;
                    case R.id.nav_logout:
                        logoutSession();
                }
            }

        };

        drawer.addDrawerListener(toggle);
        toggle.syncState();

        initializeUI();
        checkUserSession();
    }

    private void initializeUI() {

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        nav_header_view = navigationView.getHeaderView(0);

        tvName = (TextView) nav_header_view.findViewById(R.id.tv_name);
        tvCompanyName = (TextView) nav_header_view.findViewById(R.id.tvCompanyName);
        tvCompanyEmail = (TextView) nav_header_view.findViewById(R.id.tvEmail);
        imageView = (ImageView) nav_header_view.findViewById(R.id.iv_profile_picture);

    }

    @Override
    public void onResume() {
        super.onResume();
        refreshFragment();

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_main);

            if (f instanceof DailySalesFragment) {
                closeSession();
            } else {
//                openHomeFragment();
                openDailySalesFragment();
            }

        }
    }

    private void checkUserSession() {
        String authToken = UserSession.getToken(this);

        if (authToken.length() <= 0 && UserAccount.checkUserCount(context) > 0) {
            openUserActivity();
        } else if (authToken.length() <= 0) {
            Intent login_intent = new Intent(this, LoginActivity.class);
            startActivity(login_intent);
            this.finish();
        } else {
            updateNavName(context);
            openDailySalesFragment();
        }
    }

    public void updateNavName(Context context) {
        tvName.setText(UserSession.getFirstName(context) + " " + UserSession.getLastName(context));
        tvCompanyName.setText(UserSession.getCompany(this));
        tvCompanyEmail.setText(UserSession.getEmployeeEmail(this));
        showProfilePic();
    }

    public void showProfilePic() {
//        if (UserSession.getProfilePicture(context).contains("media")) {
//            RequestOptions myOption = new RequestOptions().circleCrop();
//            Glide.with(context).load(UserSession.getProfilePicture(context)).apply(myOption).into(imageView);
//        }
    }

    private void logoutSession() {
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case DialogInterface.BUTTON_POSITIVE:
                        //Yes button clicked
                        UserSession.clearSession(context);
                        removeAllInCart();
                        checkUserSession();
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        //No button clicked
                        break;
                }
            }
        };

        PopUpProvider.buildConfirmationDialog(context, dialogClickListener, "Confirm logout", "Are you sure you want to log out?");
    }

    private void closeSession() {
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case DialogInterface.BUTTON_POSITIVE:
                        //Yes button clicked
                        MainActivity.super.onBackPressed();
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        //No button clicked
                        break;
                }
            }
        };

        PopUpProvider.buildConfirmationDialog(context, dialogClickListener, "Are you sure you want to close application?", null);
    }

    private void removeAllInCart() {
        Checkout checkout = new Checkout();
        checkout.deleteAll(context);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        selectNavId = id;

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    private void refreshFragment() {
        try {
            Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_main);

            if (f instanceof CompanyFragment) {
                openCompanyFragment();
            } else if (f instanceof OrderedFragment) {
                openOrderedFragment();
            } else if (f instanceof AccountFragment) {
                openAccountFragment();
            } else {
//                openHomeFragment();
                openDailySalesFragment();
            }


        } catch (Exception err) {
            Toasty.error(context, err.toString()).show();
        }
    }

    private void openUserActivity() {
        Intent intent = new Intent();
        intent.setClass(context, UserAccountActivity.class);
        startActivity(intent);
        this.finish();
    }

    private void openHomeFragment(String uuid) {

        Bundle bundle = new Bundle();
        bundle.putString("uuid", uuid);

        HomeFragment homeFragment = new HomeFragment();
        homeFragment.setArguments(bundle);
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.content_main, homeFragment, homeFragment.getTag()).commit();
    }

    private void openOrderedFragment() {
        setTitle("My Purchases");
        OrderedFragment orderedFragment = new OrderedFragment();
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.content_main, orderedFragment, orderedFragment.getTag()).commit();
    }

    private void openAccountFragment() {
        setTitle("Account");
        AccountFragment accountFragment = new AccountFragment();
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.content_main, accountFragment, "ACCOUNT_TAG").commit();

    }

    private void openCompanyFragment() {
        setTitle("Store");
        CompanyFragment companyFragment = new CompanyFragment();
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.content_main, companyFragment, companyFragment.getTag()).commit();
    }

    private void openDailySalesFragment() {
        setTitle("Daily Sales");
        DailySalesFragment dailySalesFragment = new DailySalesFragment();
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.content_main, dailySalesFragment, dailySalesFragment.getTag()).commit();
    }

    private void openSearchFragment() {
        setTitle("Select Category");
        replaceFragment(SearchFragment.class, null);
    }

    public void replaceFragment(Class fragmentClass, Bundle bundle) {
        Fragment fragment = null;
        try {
            fragment = (Fragment) fragmentClass.newInstance();
            fragment.setArguments(bundle);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, fragment).commit();
    }

    // Online functions
    public void fetchCategory() {
        try {
            HttpClientProvider.get(context, "read_category/", null, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {
                    super.onStart();
                }

                @Override
                public void onPreProcessResponse(ResponseHandlerInterface instance, HttpResponse response) {
                    super.onPreProcessResponse(instance, response);

                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    try {
                        tabLayout.removeAllTabs();

                        categoryArrayList = new Gson().fromJson(response.getJSONArray("records").toString(), new TypeToken<ArrayList<Category>>() {
                        }.getType());

                        Category category = new Category();
                        category.setName("All");
                        categoryArrayList.add(0, category);

                        for (Category inventory : categoryArrayList) {
                            tabLayout.addTab(tabLayout.newTab().setText(inventory.getName()));
                        }

                    } catch (Exception err) {
                        Toasty.error(context, err.toString()).show();
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    Toasty.error(context, "Can't Connect to Server").show();
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    Toasty.error(context, responseString).show();
                }

                @Override
                public void onRetry(int retryNo) {
                    super.onRetry(retryNo);
                }

                @Override
                public void onFinish() {
                }
            });


        } catch (Exception err) {
            Toasty.error(context, err.toString()).show();
        }
    }

    public void displayTabForHomeFragment() {
        fetchCategory();

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int position = tab.getPosition();
                for (int i = 0; i < categoryArrayList.size(); i++) {
                    if (position > 0) {
                        uuId = categoryArrayList.get(position).getUuId();
                        Bundle bundle = new Bundle();
                        bundle.putString("uuid", uuId);
                        openHomeFragment(uuId);
                        break;
                    } else {
                        openHomeFragment("");
                        break;
                    }
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }
}

Вот мой фрагмент -

public class AccountFragment extends Fragment {
    private static final int REQUEST_IMAGE_CAPTURE = 1;

    // View and Context
    private View view;
    private Context context;

    // Widget
    private EditText tvFirstName, tvLastName, tvCode, tvEmail, tvEmployeeId;
    private ImageView imageView;
    private ProgressDialog progressDialog;
    private Button btnUpdate, btnUpload;
    private boolean updateSuccess = false;

    //Data
    private ArrayList<UserAccount> userAccountArrayList = new ArrayList<>();
    private String mCurrentPhotoPath;
    private Bitmap mImageBitmap;

    // Handles Interface and Initialization Functions
    // Parameters - Default
    // Return - View mag display sa layout

    public AccountFragment(){
        super();
    }


    public static AccountFragment newInstance(int sectionNumber) {
        AccountFragment fragment = new AccountFragment();
        Bundle args = new Bundle();
        args.putInt("ARG_SECTION_NUMBER", sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_account, container, false);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        setHasOptionsMenu(true);
        context = getContext();
        initializeUI();
    }

    // Initialize component from a layout file
    private void initializeUI() {
        tvFirstName = view.findViewById(R.id.tv_firstname);
        tvLastName = view.findViewById(R.id.tv_lastname);
        tvCode = view.findViewById(R.id.tv_code);
        tvEmail = view.findViewById(R.id.tv_email);
        tvEmployeeId = view.findViewById(R.id.tv_employee_id);
        imageView = view.findViewById(R.id.iv_User);
        btnUpdate = view.findViewById(R.id.btn_update);
        btnUpload = view.findViewById(R.id.btn_UploadImage);

        ((MainActivity) context).tabLayout.setVisibility(View.GONE);
        getUserProfile();

        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateUserProfile();
            }
        });

//        showProfilePic();

        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchTakePictureIntent();
            }
        });

    }

    private void dispatchTakePictureIntent() {
        Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(camIntent, REQUEST_IMAGE_CAPTURE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(photo);
        }
    }

    private void showProfilePic() {
        if (UserSession.getProfilePicture(context).contains("media")) {
            RequestOptions myOption = new RequestOptions().circleCrop();
            Glide.with(context).load(UserSession.getProfilePicture(context)).apply(myOption).into(imageView);
        }
    }

    private void displayEmployeeDetails() {

        tvFirstName.setText(UserSession.getFirstName(getContext()));
        tvLastName.setText(UserSession.getLastName(getContext()));
        tvCode.setText(UserSession.getEmployeeCode(getContext()));
        tvEmail.setText(UserSession.getEmployeeEmail(getContext()));
        tvEmployeeId.setText(UserSession.getYpoEmployeeId(getContext()));
//        showProfilePic();
    }

    public void getUserProfile() {
        try {

            HttpClientProvider.get(context, "customer_profile/", null, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {
                    super.onStart();
                    progressDialog = new ProgressDialog(context);
                    progressDialog.setMessage("Loading...");
                    progressDialog.setCancelable(false); // disable dismiss by tapping outside of the dialog
                    progressDialog.show();
                }

                @Override
                public void onPreProcessResponse(ResponseHandlerInterface instance, HttpResponse response) {
                    super.onPreProcessResponse(instance, response);

                }


                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    try {
                        UserSession session = new Gson().fromJson(response.toString(), new TypeToken<UserSession>() {
                        }.getType());
                        session.saveUserSession2(context);
                        if (session.saveUserSession2(context)) {
                            displayEmployeeDetails();
                            ((MainActivity) getActivity()).updateNavName(context);
                        }

                        if (updateSuccess) {

                            Toasty.success(context, "Update success", Toast.LENGTH_SHORT).show();

                            //Update account in database
                            String searchQuery;
                            searchQuery = " WHERE e_mail LIKE '%" + UserSession.getEmployeeEmail(context) + "%' ";
                            userAccountArrayList = UserAccount.read(context, searchQuery);

                            for (UserAccount userAccount : userAccountArrayList) {
                                userAccount.setFirstName(UserSession.getFirstName(getContext()));
                                userAccount.setLastName(UserSession.getLastName(getContext()));
                                userAccount.setEmail(UserSession.getEmployeeEmail(getContext()));
                                userAccount.setToken(UserSession.getToken(getContext()));
                                userAccount.save(context);
                            }

                        }

                    } catch (Exception err) {
                        Toasty.error(context, err.toString()).show();
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    Debugger.printO("JSONObject " + throwable.toString());
                    Toasty.error(context, "Server Error").show();
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    Toasty.error(context, responseString).show();
                }

                @Override
                public void onFinish() {
                    progressDialog.dismiss();
                }
            });


        } catch (Exception err) {
            Toasty.error(context, err.toString()).show();
        }

    }

    private void updateUserProfile() {

        try {

            JSONObject jsonObject = new JSONObject();
            jsonObject.put("first_name", tvFirstName.getText().toString());
            jsonObject.put("last_name", tvLastName.getText().toString());
            jsonObject.put("code", tvCode.getText().toString());
            jsonObject.put("ypo_employee_id", tvEmployeeId.getText().toString());

            StringEntity stringEntity = new StringEntity(jsonObject.toString());

            HttpClientProvider.post(context, "customer_profile/", stringEntity, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {
                    super.onStart();
                    progressDialog = new ProgressDialog(context);
                    progressDialog.setMessage("Loading...");
                    progressDialog.setCancelable(false); // disable dismiss by tapping outside of the dialog
                    progressDialog.show();
                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {

                    try {
                        super.onSuccess(statusCode, headers, response);

                        getUserProfile();
                        updateSuccess = true;

                    } catch (Exception err) {
                        Toasty.error(context, err.toString()).show();
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    super.onFailure(statusCode, headers, throwable, errorResponse);
                    Toasty.error(context, "Server Error").show();
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
                    super.onFailure(statusCode, headers, throwable, errorResponse);
                    Toasty.error(context, errorResponse.toString()).show();

                }

                @Override
                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    super.onFailure(statusCode, headers, responseString, throwable);
                    Toasty.error(context, responseString).show();
                }

                @Override
                public void onFinish() {
                    progressDialog.dismiss();
                }

            });

        } catch (Exception err) {
            Toasty.error(context, err.toString()).show();
        }
    }

    //Hide item in Action bar
    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        MenuItem menuItem = menu.findItem(R.id.action_cart);
        MenuItem quantityItem = menu.findItem(R.id.action_quantity);
        MenuItem searchViewItem = menu.findItem(R.id.action_search);
        MenuItem menuRemove = menu.findItem(R.id.action_remove_all);
        menuRemove.setVisible(false);
        menuItem.setVisible(false);
        quantityItem.setVisible(false);
        searchViewItem.setVisible(false);
    }

Вот мой манифест -

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-feature android:name="android.hardware.camera" android:required="true"/>

Когда я щелкнул намерение камеры во фрагменте, изображение в моем фрагменте не изменится.Я не знаю, почему это происходит, потому что это прекрасно работает в деятельности.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

переопределить onActivityResult в MainActivity.сделайте imageView общедоступным и получите доступ к imageView к методу результата действия следующим образом.

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_main);

            if (f instanceof AccountFragment) {
                 Bitmap photo = (Bitmap) data.getExtras().get("data");
                 f.imageView.setImageBitmap(photo);
            }

        }
    }
0 голосов
/ 17 декабря 2018

В Activity.onResume () вы в конечном итоге звоните openAccountFragment ().Это создает новый фрагмент и запускается каждый раз, когда экран становится видимым (кстати, возможно, несвязанная ошибка заключается в том, что вы не вызываете newInstance() здесь.)

Каждый раз, когда вы создаете новый фрагмент,старый удаляется.

Но ваша функция обратного вызова происходит со старым фрагментом, который больше не присоединен или, следовательно, не виден (обратите внимание, это связано с комментариями Майка )

Решение состоит в том, чтобы не заменять существующий фрагмент новым, если у вас уже есть правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...