Аргумент байтового массива null во фрагменте - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в android и провожу некоторые исследования о viewpager, activity и fragment, но моя проблема в том, что после того, как я сделал снимок, изображение не показывалось в layout.

Вот код, где я делаю снимок:

public class MainStepView extends AppCompatActivity {

private StepperIndicator indicator;
private FloatingActionButton fabCapture;

@Override
protected  void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stepview_main);
    setTitle("New Customer");

    indicator = (StepperIndicator) findViewById(R.id.stepper_indicator);
    fabCapture = (FloatingActionButton) findViewById(R.id.fabCamera);

    final ViewPager pager = findViewById(R.id.viewPager);
    pager.setAdapter(new PagerAdapter(getSupportFragmentManager()));

    indicator.setViewPager(pager, true);
    indicator.addOnStepClickListener(new StepperIndicator.OnStepClickListener() {
        @Override
        public void onStepClicked(int step) {
            pager.setCurrentItem(step, true);
        }
    });


    fabCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, indicator.getCurrentStep());
        }
    });


}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == Activity.RESULT_OK){
        if(requestCode == 3){
            Bundle bundle = data.getExtras();
            ByteArrayOutputStream bStream = new ByteArrayOutputStream();
            final Bitmap bmp = (Bitmap) bundle.get("data");
            bmp.compress(Bitmap.CompressFormat.PNG, 100, bStream);
            byte[] byteArray = bStream.toByteArray();
            ClientIdFragment fragment = new ClientIdFragment();
            bundle.putByteArray("image", byteArray);
            fragment.setArguments(bundle);
        }
    }
}
}

Вот код, где должно отображаться изображение

public class ClientIdFragment extends Fragment {

ImageView ivClientId;
FloatingActionButton fabCapture;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.stepview_client_id, container, false);
    Bitmap bmp;
    ivClientId = (ImageView) v.findViewById(R.id.ivClientId);
    fabCapture = (FloatingActionButton) v.findViewById(R.id.fabCamera);

    byte[] byteArray = null;
    if (byteArray != null && byteArray.length > 0){
    byteArray =  getActivity().getIntent().getByteArrayExtra("image");
    bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    ivClientId.setImageBitmap(bmp);
    }

    return v;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    ivClientId = (ImageView) view.findViewById(R.id.ivClientId);
} 
}

Здесь я отображаю различные макеты:

public class PagerAdapter extends FragmentPagerAdapter {

public PagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
   switch (position){
       case 0: return new ClientInfoFragment();
       case 1: return new ClientAddressFragment();
       case 2: return new ClientOtherFragment();
       case 3: return new ClientIdFragment();
       case 4: return new ClientSelfieFragment();
       case 5: return new ClientWithIdFragment();
       case 6: return new ClientSignatureFragment();
       default : return new ClientSummaryFragment();
   }
}

@Override
public int getCount() {
    return 9;
}
}

Вот мой сценарий: у меня есть 7 макетов, вызванных viewpager с использованием stepperindicator, прежде чем я сделаю снимок, я go планирую, где изображение будет отображаться и инициировать fab затем, после того как я сделаю снимок, изображение не было отображено в макете

Примечание: изображение было сохранено в галерее. Спасибо за ваш ответ

1 Ответ

1 голос
/ 07 февраля 2020

Вы читаете байтовый массив из аргументов Activity Intent:

byteArray =  getActivity().getIntent().getByteArrayExtra("image");

, но он хранится в аргументах Fragment. Вы должны сделать:

byteArray = getArguments().getByteArray("image");

Кроме того, вы извлекаете его только в условном выражении, которое всегда ложно:

byte[] byteArray = null;
if (byteArray != null && byteArray.length > 0){

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

Весь этот блок, вероятно, должен быть:

byte[] byteArray = getArguments().getByteArray("image");
if (byteArray != null && byteArray.length > 0){
    bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    ivClientId.setImageBitmap(bmp);
}

И последнее, но не менее важное: вы отбрасываете Фрагмент, не добавляя его, а затем создавая еще один без аргументов в вашем PagerAdapter. Вам нужно установить аргументы для этого экземпляра.

...