2014-10-06 2 views
0

Я новичок в Android, и я использую API версии 4.4. Я использую ViewPager для отображения фрагмента точно так, как описано в этой ссылке. http://developer.android.com/training/animation/screen-slide.html.Обновление текущей страницы Android ViewPager происходит на следующей странице

Что делает мое приложение, это позволяет пользователю делать снимок с камеры, и когда он нажимает на следующую кнопку, он может добавить другое изображение, и он может продолжать делать это (также он может перейти на предыдущую страницу). Я показываю его изображение внутри imageView.

Я обновляю изображение в фрагменте в методе onActivityResult внутри фрагмента. Проблема в том, что когда я меняю imageView (на его фотокамеру), он переходит к следующей странице в viewPager, не находящейся на текущей странице. Также, что я заметил, функция onResume в моем классе Fragment срабатывает несколько раз, когда страница загружается в первый раз.

Это мой код до сих пор,

MainActivity.java

private static final int MAX_IMAGES = 10; 
protected int currentIndex=0; // Which page we are currently in 
private ImageFragment fragment; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    viewPager = (ViewPager)findViewById(R.id.viewPager); 
    pageAdapter = new TicketImageAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(pageAdapter); 

    //LinearLayout uploadImage = ((LinearLayout)findViewById(R.id.uploadImage)); 
    Button nextButton   = (Button)findViewById(R.id.nextBttn); 
    Button saveButton   = (Button)findViewById(R.id.saveButton); 
    Button previousButton  = (Button)findViewById(R.id.previousBttn); 

    nextButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      if(fragment != null) 
      { 
       fragment.addTicketImage(); 
       displayTicketImages(); 
      } 

      if(MAX_IMAGES > currentIndex) 
      { 
       currentIndex++; 
       Log.d("Currect Index; ",currentIndex+""); 
       setCurrentItem (currentIndex, true); 
      } 
     } 
    }); 
// Set current page fragment so I can access it's methods 
public void setFragment(TicketImageFragment fragment) 
{ 
    this.fragment = fragment; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //Don't worry about fragment been null, coz it is not. I Set the fragment in the on 
    if(this.fragment != null) 
    { 
     this.fragment.onActivityResult(requestCode, resultCode, data); 
    } 
} 

    public static class TicketImageAdapter extends FragmentPagerAdapter { 

    public TicketImageAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return new ImageFragment(); 
    } 
} 

}

ImageFragment.java

Это где я перенаправлять общий пользователь камеру и отобразить его изображение как предварительный просмотр в изображении.

private TextView firstText; 
private MainActivity activity; 
View view; 
ImageView imgPreview; 

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

    LinearLayout uploadImageBttn = ((LinearLayout)view.findViewById(R.id.uploadImageButton)); 
    firstText     = ((TextView)view.findViewById(R.id.note)); 



    imgPreview = (ImageView)view.findViewById(R.id.ticketImage); 

    uploadImageBttn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      activity.helper = new CameraHelper(v.getContext()); 
      activity.helper.captureImage(); // Capture image and save it 
     } 
    }); 

    this.activity = (TicketImageActivity)getActivity(); 

    // Set fragment So the activity can call onActivityResult on this fragment 
    this.activity.setFragment(this); 

    return view; 
} 

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

    if(imgPreview == null) 
     Log.d("imagePreviewView", "NULL"); 
    else 
     Log.d("UploadButton", "NOT NULL"); 

    // if the result is capturing Image 
    if (requestCode == CameraHelper.getCode()) { 
     if (resultCode == Activity.RESULT_OK) { 

      //ImageView imgPreview = (ImageView)view.findViewById(R.id.ticketImage); 
      previewCapturedImage(imgPreview,"this is the image path");// Preview captured image 

     } else if (resultCode == Activity. RESULT_CANCELED) { 
      // user cancelled Image capture 
      Toast.makeText(view.getContext(), 
        "User cancelled image capture", Toast.LENGTH_SHORT) 
        .show(); 
     } else { 
      // failed to capture image 
      Toast.makeText(view.getContext(), 
        "Sorry! Failed to capture image", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } 
} 
public void previewCapturedImage(ImageView imgPreview,String imagePath) { 
    try { 

     imgPreview.setVisibility(View.VISIBLE); // If the image view is hidden, show it 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 8; 

     try { 
      Bitmap bitmap = BitmapFactory.decodeFile(mImagePath, 
        options); 
      ExifInterface exif = new ExifInterface(mImagePath); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
      Matrix matrix = new Matrix(); 

      if (orientation == 6) { 
       matrix.postRotate(90); 
      } 
      else if (orientation == 3) { 
       matrix.postRotate(180); 
      } 
      else if (orientation == 8) { 
       matrix.postRotate(270); 
      } 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); // rotating bitmap 
      imgPreview.setImageBitmap(bitmap); 
     } 
     catch (Exception e) { 
      Log.d("Exception :",e.getMessage()); 
     } 
     //date = null; 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
} 

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewPager" 
    android:layout_width="wrap_content" 
    android:layout_height="400dp"/> 

<LinearLayout android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <Button 
     android:id="@+id/previousBttn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="left" 
     android:text="@string/Previous" /> 

    <Button 
     android:id="@+id/saveButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="center" 
     android:text="@string/saveButton" /> 

    <Button 
     android:id="@+id/nextBttn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="right" 
     android:text="@string/Next" /> 
</LinearLayout>  

activity_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout android:layout_width="match_parent" 
     android:layout_height="320dp" 
     android:orientation="vertical" 
     android:id="@+id/uploadImageButton" 
     android:background="@drawable/customborder"> 

     <TextView android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/uploadImageText"/> 

     <ImageView 
      android:id="@+id/ticketImage" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_margin="5dp" 
      android:layout_gravity="center"/> 

    </LinearLayout> 

    <EditText 
     android:id="@+id/note" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:inputType="text" 
     android:hint="@string/enterNote" /> 

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

Любая помощь будет высоко оценена. Благодаря!

+0

'Я использую pagerView'. Ты уверен? – greenapps

+0

О! Извините, я исправил его на ViewPager. Если что-то еще не так, укажите это мне, поскольку я новичок в этом поле. Благодаря! –

ответ

0
this.activity.setFragment(this); 

Вы должны сделать это в обработчике onClick адаптера.

Поскольку ViewPager всегда создает следующую страницу, MainActivity.fragment не будет обрабатывать фактический фрагмент. Если вы хотите использовать фрагмент в onActivityResult, тогда используйте setFragment, когда вы вызываете намерение.

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

UPDATE: вы можете получить правильный фрагмент в самой деятельности:

Используйте ответ madx в Get the current fragment object

Это работает для меня.

+0

Я обязательно сделаю это. Что вы подразумеваете под обработчиком onClick greenapps? Я хочу установить изображение в imageView, как только он вернется к активности после захваченного изображения камеры. Благодаря! –

+0

Функция члена onClick четыре строки до. – greenapps

+0

Ах, отлично! Завтра я расскажу о прогрессе. Спасибо за помощь! –

0
  1. Прежде всего ViewPager экземпляр следующей страницы, когда это возможно, поэтому вы можете изменить действие следующей страницы.
  2. Ссылка на текущий фрагмент на MainActivity.

    private Fragment currentFragment; 
    
  3. Update currentFragment ссылка с Button щелчком мыши.

    public void onClick(View v) { 
    Intent intent = new Intent(getContext(), OtherAcivity.class); 
    ((MainActivity)getActivity).setCurrentFragment(MyFragment.this); 
          startActivityForResult(intent); 
         } 
    
  4. Использование currentFragment refence из MainActivity когда данные фрагмента обновления.

    ((MainActivity)getActivity).getCurrentFragment().doSomething(); 
    
Смежные вопросы