Кнопка фрагмента вызывает ошибку обратного стека - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать приложение, которое будет получать некоторую информацию с сервера, используя залп. Вы должны ввести свои данные, а затем нажать кнопку «Войти» внизу, но по какой-то причине происходит сбой.

В первую очередь при нажатии кнопки происходит сбой, и logcat: https://pastebin.com/deQi874r

Основной код активности:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar)findViewById(R.id.my_toolbar);
    setSupportActionBar(toolbar);

    TextView textView = (TextView)findViewById(R.id.currentFragDisplay);
    textView.setText("My Profile");

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragmentContainer, new Personal_Profile_Fragment());
    fragmentTransaction.commit();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.toolbar_menu, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int item_id = item.getItemId();
    switch (item_id) {
        case R.id.accDetails:
            swapFragment(item_id);
            return true;
        case R.id.personalProfileLookup:
            swapFragment(item_id);
            return true;
        case R.id.favoriteCharacters:
            swapFragment(item_id);
            return true;
        case R.id.friendProfileLookup:
            swapFragment(item_id);
            return true;
        case R.id.tipsAndTricks:
            swapFragment(item_id);
            return true;

    }
    return false;
}

private void swapFragment(int fragmentID){

    TextView tracker = (TextView) findViewById(R.id.currentFragDisplay);

    Fragment fragment = null;
    if(fragmentID == R.id.personalProfileLookup) {
        tracker.setText("My Profile");
        fragment = new Personal_Profile_Fragment();
    } else if(fragmentID == R.id.favoriteCharacters) {
        tracker.setText("Favorite Characters");
        fragment = new Favorite_Characters_Fragment();
    } else if(fragmentID == R.id.friendProfileLookup) {
        tracker.setText("Friend Lookup");
        fragment = new Friend_Profile_Fragment();
    } else if(fragmentID == R.id.tipsAndTricks) {
        tracker.setText("Tips and Tricks");
        fragment = new TipsandTricks_Fragment();
    } else if(fragmentID == R.id.accDetails) {
        tracker.setText("Log In");
        fragment = new loginFragment();
    }


    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragmentContainer, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

}

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

}

фрагмент логина (где кнопка):

public class loginFragment extends Fragment {

//Local Vars
private boolean loginCheck = false;

//required constructor
public loginFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

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

    Button button = (Button) view.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            login(v);
        }
    });

    // Inflate the layout for this fragment
    return view;

}

public boolean isLoggedIn() {
    return loginCheck;
}



private void login(View v){
    Toast.makeText(getActivity(),"Clicked",Toast.LENGTH_LONG).show();


    String username;
    String password;

    username = v.findViewById(R.id.enteredUsername).toString();
    password = v.findViewById(R.id.enteredPassword).toString();

    final ArrayList<String> info = new ArrayList<>();

    String[] unameSeparated = new String[username.length()];
    unameSeparated = username.split("(?!^)");

    String startUrl = "https://us.api.battle.net/d3/profile/";
    String uname = "";
    String APIKey = "/?locale=en_US&apikey=6nguxckrzchn86q9792jvdhww4uxf32v";

    //Separating the username into the parts needed for sending request
    for (int i = 0; i < unameSeparated.length; i++) {
        if ((unameSeparated[i].equals("#"))) {
            //Replacing # with '%23'
            uname += "%23";
        } else {
            uname += unameSeparated[i];
        }
    }

    String url = startUrl + uname+ APIKey;

    // Instantiate the RequestQueue.
    RequestQueue queue = Volley.newRequestQueue(getActivity());

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    info.add(response);
                    Toast.makeText(getActivity(),"Request Success",Toast.LENGTH_LONG).show();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(),"Request FAIL",Toast.LENGTH_LONG).show();

        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);
}

}

1 Ответ

0 голосов
/ 02 мая 2018

Проблема с кликом при входе. Вы передаете кнопку, а не вид в

login(v);

V, который вы передаете, является экземпляром кнопки, а не представлением. Так что это

username = v.findViewById(R.id.enteredUsername).toString();
password = v.findViewById(R.id.enteredPassword).toString();

будет ссылаться на нулевой указатель. Надеюсь, это поможет

...