2016-02-03 1 views
0

Я получаю ошибкуПочему я получаю нулевой указатель execepiton при поиске фрагмента по ID?

java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {com.example.dhruv.parqueue/com.example.dhruv.parqueue.UserProfile}: java.lang.NullPointerException : Попытка вызвать виртуальный метод 'android.view.View android.app.Dialog.findViewById (интермедиат)' на нуль ссылки на объект

Вот мой код

public class UserProfile extends AppCompatActivity { 

    FragmentManager fm; 
    CheckBox showPassword; 
    Dialog passwordChangeDialog; 
    private ImageView imageView; 
    SharedPreferences preferences; 
    private final int SELECT_PHOTO = 1; 
    TextView nameText, contactText, emailText; 
    PasswordChangeFragment passwordChangeFragment; 
    Button confirmButton, changePassword, pickImage; 
    EditText nameEdit, contactEdit, newPassword, oldPassword; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_user_profile); 

     preferences = getSharedPreferences("MyFiles", MODE_PRIVATE); 
     imageView = (ImageView) findViewById(R.id.imageView); 
     pickImage = (Button) findViewById(R.id.btn_pick); 
     changePassword = (Button) findViewById(R.id.changePassword); 

     fm = getSupportFragmentManager(); 
     passwordChangeFragment = PasswordChangeFragment.newInstance("Change Password"); 
     passwordChangeDialog = passwordChangeFragment.getDialog(); 

     showPassword = (CheckBox) passwordChangeDialog.findViewById(R.id.show_password); 
     newPassword = (EditText) passwordChangeDialog.findViewById(R.id.new_password); 
     oldPassword = (EditText) passwordChangeDialog.findViewById(R.id.old_password); 
     confirmButton = (Button) passwordChangeDialog.findViewById(R.id.confirm_btn); 

     SharedPreferences.Editor editor = preferences.edit(); 
     editor.putBoolean("editButtonClicked", false); 
     editor.commit(); 

     setProfile(); 

     pickImage.setVisibility(pickImage.GONE); 
     changePassword.setVisibility(changePassword.GONE); 

     new ProfileSyncTask().execute(); 

     pickImage.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
       photoPickerIntent.setType("image/*"); 
       startActivityForResult(photoPickerIntent, SELECT_PHOTO); 
      } 
     }); 

     changePassword.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       passwordChangeFragment.show(fm, "change_password_fragment"); 
      } 
     }); 

     showPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (!isChecked) { 
        newPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); 
       } else { 
        newPassword.setInputType(129); 
       } 
      } 
     }); 

     confirmButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (matchpassword(oldPassword.getText().toString())) { 
        String changedPassword = newPassword.getText().toString(); 
        //Write this password to Database and Display Success using AlertFragment 
       } else { 
        //Display Wrong Password using AlertFragment 
       } 
      } 
     }); 

    } 
. 
. 
. 
} 

Я получаю ошибку в строке:

showPassword = (CheckBox) passwordChangeDialog.findViewById(R.id.show_password); 

Вот полная ошибка

02-03 13:54:49.112 24058-24058/com.example.dhruv.parqueue E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.dhruv.parqueue, PID: 24058 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dhruv.parqueue/com.example.dhruv.parqueue.UserProfile}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Dialog.findViewById(int)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5466) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Dialog.findViewById(int)' on a null object reference 
    at com.example.dhruv.parqueue.UserProfile.onCreate(UserProfile.java:97) 
    at android.app.Activity.performCreate(Activity.java:6251) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5466) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Вот код для файла change_password_fragment

<?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" 
    android:padding="50dp"> 

    <EditText 
     android:id="@+id/old_password" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/current_password" 
     android:inputType="textPassword" /> 

    <EditText 
     android:id="@+id/new_password" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/new_password" 
     android:inputType="textVisiblePassword" /> 

    <CheckBox 
     android:id="@+id/show_password" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:text="@string/show_password" /> 

    <Button 
     android:id="@+id/confirm_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="10dp" 
     android:text="@string/Confirm" /> 

</LinearLayout> 

Edit:

Я изменил свой код (согласно предложению) и воспользовался nted onCreateDialog следующий

public class PasswordChangeFragment extends DialogFragment { 

    public PasswordChangeFragment() { 
     } 

    public static PasswordChangeFragment newInstance(String title, String userID) { 
     PasswordChangeFragment frag = new PasswordChangeFragment(); 
     Bundle args = new Bundle(); 
     args.putString("title", title); 
     args.putString("userID", userID); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.change_password_fragment, container); 
    } 

    View myView; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 
     String title = getArguments().getString("title", "Change Password"); 
     final String userID = getArguments().getString("userID", ""); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage("foo") 
       .setPositiveButton("Start timer", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 

        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // Cancel 
        } 
       }); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     myView = inflater.inflate(R.layout.change_password_fragment, null); 
     builder.setView(myView); 

     final CheckBox showPassword = (CheckBox) myView.findViewById(R.id.show_password); 
     final EditText newPassword = (EditText) myView.findViewById(R.id.new_password); 
     final EditText oldPassword = (EditText) myView.findViewById(R.id.old_password); 
     final Button confirmButton = (Button) myView.findViewById(R.id.confirm_btn); 

     showPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (!isChecked) { 
        newPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); 
       } else { 
        newPassword.setInputType(129); 
       } 
      } 
     }); 

     confirmButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Helper helper = new Helper(); 
       try { 
        if (helper.matchPassword(userID, oldPassword.getText().toString())) { 
         String changedPassword = newPassword.getText().toString(); 
         //Write this password to Database and Display Success using AlertFragment 
        } else { 
         //Display Wrong Password using AlertFragment 
        } 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     return builder.create(); 
    } 

    @Override 
    @Nullable 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     // Get field from view 
     String title = getArguments().getString("title", "Change Password"); 
     final String userID = getArguments().getString("userID", ""); 
     // Fetch arguments from bundle and set title 
     FragmentManager fm = getActivity().getSupportFragmentManager(); 
     PasswordChangeFragment passwordChangeFragment = PasswordChangeFragment.newInstance(title, userID); 
    } 
} 

Теперь я получаю ошибку

FATAL EXCEPTION: main 
     Process: com.example.dhruv.parqueue, PID: 3564 
     android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
     at com.android.internal.policy.PhoneWindow.requestFeature(PhoneWindow.java:317) 
     at com.android.internal.app.AlertController.installContent(AlertController.java:231) 
     at android.app.AlertDialog.onCreate(AlertDialog.java:423) 
     at android.app.Dialog.dispatchOnCreate(Dialog.java:394) 
     at android.app.Dialog.show(Dialog.java:295) 
     at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:406) 
     at android.support.v4.app.Fragment.performStart(Fragment.java:1986) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Инстанцировать кнопки с новыми кнопками(); и другие компоненты тоже ... они являются нулевыми, потому что не созданы ... и делают некоторые исследования, прежде чем отправлять такие вопросы, как вы можете получить слишком много downvotes. – therealprashant

+0

. Где вы указали в диалоговом окне «Диалог» в коде? –

+0

опубликуйте свой xml и код PasswordChangeFragment – kopikaokao

ответ

1

PasswordChangeFragment, жить каждый фрагмент, должно пройти через его жизненный цикл. Вы не можете делать никаких предположений, когда Android будет звонить onCreatDialog, результат которого возвращается getDialog(). Вы должны избавиться от

showPassword = (CheckBox) passwordChangeDialog.findViewById(R.id.show_password); 
newPassword = (EditText) passwordChangeDialog.findViewById(R.id.new_password); 
oldPassword = (EditText) passwordChangeDialog.findViewById(R.id.old_password); 
confirmButton = (Button) passwordChangeDialog.findViewById(R.id.confirm_btn); 

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

+0

. Где я буду устанавливать слушателей для этих элементов. –

+0

Я бы настоятельно рекомендовал вам взглянуть на документацию DialogFragment – Blackbelt

+0

Спасибо за совет @blackbelt –

1
passwordChangeFragment = PasswordChangeFragment.newInstance("Change Password"); 
passwordChangeDialog = passwordChangeFragment.getDialog(); 

Вызов getDialog() метод сразу же после создания DialogFragment возвратит нуль, потому что она еще не создана. DialogFragment вызовет onCreateDialog() позже, чтобы получить диалог, поэтому вы должны переопределить этот метод и поместить свои методы findViewById().

0

попробовать это ...

PasswordChangeFragment passwordChangeFragment = new PasswordChangeFragment().newInstance("Change Password"); 
Dialog passwordChangeDialog = passwordChangeFragment.getDialog(); 
+0

Я все еще получаю ту же ошибку. –