0

Привет, я работаю над фрагментом, у которого есть кнопка, которая позволит пользователю выбрать изображение для загрузки. Однако при попытке протестировать фрагмент он падает. Где он заявляет, что он сбой, если я удалю код, тогда появится кнопка, и я могу пойти в свою галерею, чтобы выбрать картинку, но как только я нажимаю на картинку, приложение снова падает.Android - Фрагмент onCreate падает при запуске приложения

Logcat -

10-01 01:18:39.618 7982-7982/com.myapp.app.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.myapp.app.myapp.Social.model.UserProfiles.ProfilePic.onCreate(ProfilePic.java:49) 
      at android.support.v4.app.Fragment.performCreate(Fragment.java:1481) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:908) 
      at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:838) 
      at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:843) 
      at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1071) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
      at android.view.View.measure(View.java:15291) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4819) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:15291) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:861) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:602) 
      at android.view.View.measure(View.java:15291) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4819) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2421) 
      at android.view.View.measure(View.java:15291) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1867) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1292) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1009) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4242) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
      at android.view.Choreographer.doFrame(Choreographer.java:525) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4941) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 
      at dalvik.system.NativeStart.main(Native Method) 

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

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.kii.cloud.storage.KiiObject; 
import com.kii.cloud.storage.resumabletransfer.KiiRTransfer; 
import com.kii.cloud.storage.resumabletransfer.KiiRTransferCallback; 
import com.kii.cloud.storage.resumabletransfer.KiiUploader; 
import com.myapp.app.myapp.R; 

import java.io.File; 
import java.io.FileOutputStream; 

public class ProfilePic extends Fragment { 
    private static final String TAG = "ProfilePic"; 
    String objectUri = null; 
    private static final int PICK_IMAGE = 1; 
    private Activity activity; 
private View view; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_attach_file, container, 
       false); 
     return view; 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     objectUri = getArguments().getString("object_uri"); 
     Button attachButton = (Button) 
       getView().findViewById(R.id.attach_file_button); 
     attachButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onAttachFileButtonClicked(v); 
      } 
     }); 
     setPageImage(3); 
     ImageView imageView = (ImageView) getView().findViewById(R.id.details); 
     imageView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     this.activity = activity; 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     this.activity = null; 
    } 

    public void onAttachFileButtonClicked(View v) { 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(
       Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) { 
      Uri selectedFileUri = data.getData(); 
      String filePath = getFilePathByUri(selectedFileUri); 
      Log.v(TAG, "Picture Path : " + filePath); 
      if (filePath == null) { 
       showAlert("File not exists, Please select an image that exists locally."); 
       return; 
      } 
      uploadFile(filePath); 
     } else { 
      showToast("picking file failed!"); 
     } 
    } 

    private void showToast(String message) { 
     Toast.makeText(this.activity, message, Toast.LENGTH_SHORT).show(); 
    } 

    private String getFilePathByUri(Uri selectedFileUri) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      // Workaround of retrieving file image through ContentResolver 
      // for Android4.2 or later 
      String filePath = null; 
      FileOutputStream fos = null; 
      try { 
       Bitmap bmp = MediaStore.Images.Media.getBitmap(
         this.activity.getContentResolver(), selectedFileUri); 

       String cacheDir = Environment.getExternalStorageDirectory() 
         .getAbsolutePath() + File.separator + "app"; 
       File createDir = new File(cacheDir); 
       if (!createDir.exists()) { 
        createDir.mkdir(); 
       } 
       filePath = cacheDir + File.separator + "upload.jpg"; 
       File file = new File(filePath); 

       fos = new FileOutputStream(file); 
       bmp.compress(CompressFormat.JPEG, 95, fos); 
       fos.flush(); 
       fos.getFD().sync(); 
      } catch (Exception e) { 
       filePath = null; 
      } finally { 
       if (fos != null) { 
        try { 
         fos.close(); 
        } catch (Exception e) { 
         // Nothing to do 
        } 
       } 
      } 
      return filePath; 
     } else { 
      String[] filePathColumn = { MediaStore.MediaColumns.DATA }; 
      Cursor cursor = this.activity.getContentResolver().query(
        selectedFileUri, filePathColumn, null, null, null); 

      if (cursor == null) 
       return null; 
      try { 
       if (!cursor.moveToFirst()) 
        return null; 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       if (columnIndex < 0) { 
        return null; 
       } 
       String picturePath = cursor.getString(columnIndex); 
       return picturePath; 
      } finally { 
       cursor.close(); 
      } 
     } 
    } 

    private void uploadFile(String path) { 
     KiiObject object = KiiObject.createByUri(Uri.parse(objectUri)); 
     File f = new File(path); 
     Log.v(TAG, "file can read : " + f.canRead()); 
     KiiUploader uploader = object.uploader(this.activity, f); 
     uploader.transferAsync(new KiiRTransferCallback() { 

      @Override 
      public void onStart(KiiRTransfer operator) { 
       setFragmentProgress(View.VISIBLE); 
      } 

      @Override 
      public void onTransferCompleted(KiiRTransfer operator, Exception e) { 
       setFragmentProgress(View.INVISIBLE); 
       if (e == null) { 

       } else { 

       } 
      } 
     }); 
    } 

    public void moveFromDialogFragment(Class<?> clazz) { 
     if (clazz != null) { 
      Intent i = new Intent(this.activity, clazz); 
      startActivity(i); 
     } 
    } 

    void showAlert(String message) { 
     DialogFragment newFragment = AlertDialogFragment.newInstance(
       R.string.operation_failed, message, null); 
     newFragment.show(getFragmentManager(), "dialog"); 
    } 

    void setFragmentProgress(int v) { 
     ProgressFragment fragment = (ProgressFragment) getFragmentManager() 
       .findFragmentById(R.id.progressFragment); 
     if (fragment != null && fragment.isInLayout()) { 
      fragment.setProgressBarVisiblity(v); 
     } 
    } 

    void setPageImage(int page) { 
     ProgressFragment fragment = (ProgressFragment) getFragmentManager() 
       .findFragmentById(R.id.progressFragment); 
     if (fragment != null && fragment.isInLayout()) { 
      fragment.setPageImage(page); 
     } 
    } 
} 

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

ОБНОВЛЕНИЕ Я пробовал свои предложения и принимал ту же ошибку. Это, кажется, терпеть неудачу право на -

objectUri = args.getString("object_uri"); 

UPDATE 2 Я попробовал код предложил и еще получил ту же ошибку в той же строке. Я обновил свой код и logcat, чтобы отразить сделанные изменения.

Благодаря

ответ

0

я нахожу в

Button attachButton = (Button) view.findViewById(R.id.attach_file_button); 

view не инициализирован. Я думаю, findViewById() следует поместить в onCreateView().

+0

Я переехал его и до сих пор такая же проблема – Rich

1

Вид, который возвращается onCreateView(), установлен в корневой вид фрагмента. Используйте метод getView() класса Фрагмент вместо view в onActivityCreated().

ОБНОВЛЕНИЕ

В Фрагмент жизненного цикла при добавлении фрагмента, методы обратного вызова будет вызываться в стандартной последовательности. onAttach() -> onCreate() -> onCreateView() -> onActivityCreated().

onCreateView() создает экземпляр фрагмента, и представление имеет вид корня. Ваш код верен. Однако onCreate() вызывается перед onCreateView(). Корневой вид фрагмента еще не установлен в onCreate(). Вы не можете использовать метод getView() в onCreate(). Он вернет null.

Я рекомендую вам использовать onActivityCreated() вместо onCreate() для доступа к представлению фрагмента.не

Изменить

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

в

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
+0

как бы я использовать GetView? – Rich

+0

Просто используйте его так, как в расширенном классе фрагментов. 'Button attachButton = (кнопка) getView(). FindViewById (R.id.attach_file_button);' –

+0

Хорошо, вот что я понял. Я попробовал, но получил ошибку. Проверьте мой вопрос для моего обновления. – Rich

0

Изменить

View view = inflater.inflate(R.layout.fragment_attach_file, container,false); 

в

view = inflater.inflate(R.layout.fragment_attach_file, container,false); 

вы не t нужно объявить его снова, потому что он уже объявляет private View view; вашего класса. Когда вы объявляете его снова в своем методе, он присваивает себе, поэтому переменная-член остается нулевой.

Shadowing

Update

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     objectUri = getArguments().getString("object_uri"); 
} 

UPDATE 2

вы не установили никаких аргументов для вашего фрагмента и является недействительным.

На этой линии Button attachButton=(Button)getView().findViewById(R.id.attach_file_button); также getView возвращается null, потому что onCreate вызывается перед onCreateView

+0

Если я удаляю 2-й вид, он дает ошибку на первом, ожидая выражения. – Rich

+0

Я не понимаю, что вы имеете в виду, проконсультируйтесь с ним! – mmlooloo

+0

Я пробовал ваше предложение, и это дало ошибку – Rich

Смежные вопросы