【问题标题】:From fragment to another fragment从片段到另一个片段
【发布时间】:2017-03-25 14:18:52
【问题描述】:

在第一秒钟,我制作了一个 Android 应用程序,学生可以在其中租用房间。现在我在登录和注册页面上工作。

我的注册页面有问题。在我的应用程序中,可以注册两种类型的用户,它们称为“学生”和“Verhuurder”。在帐户片段中有两个用于注册页面的按钮。我无法让它在两页上工作..

我在活动和片段方面遇到了很多麻烦......

谁能帮帮我?

我的代码:

帐户碎片

public class AccountFragment extends Fragment implements View.OnClickListener{


public AccountFragment() {
    // Required empty public constructor
}


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

    if (MainActivity.loginId == "")
    {
        return inflater.inflate(R.layout.fragment_account, container, false);
    }

    else
    {
        return inflater.inflate(R.layout.inlog_account, container, false);
    }
}


// BUTTON
Button btnStudent = (Button) view.findViewById(R.id.btnRegisterStudent);
btnStudent.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnStudent:
                //what to put here
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.fragment_container, new AccountFragmentStudent());
                ft.commit();
                break;
        }
    }
});
}

XML 帐户片段

    <Button
        android:id="@+id/btnRegisterStudent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#FFFFFF"
        android:text="Student op zoek naar een kamer"
        android:background="@color/colorPrimary"
        android:onClick="StudentRegister"/>

主活动

   public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, Callback<LoginResults> {

    private EditText emailInput;
    private EditText passwordInput;
    private HomeFragment fragment;

    public static String loginId = "";
    public static String loginSecret = "";

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

    HomeFragment fragment = new HomeFragment();
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();

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

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

public void Login(View v) {
    emailInput = (EditText) findViewById(R.id.email);
    passwordInput = (EditText) findViewById(R.id.password);
    String email = emailInput.getText().toString();
    String password = passwordInput.getText().toString();
    doLogin(email, password);
}

public void onResponse(Response<LoginResults> response) {
    if (response.isSuccess() && response.body() != null) {

        loginId = response.body().clientId;
        loginSecret = response.body().clientSecret;
        fragment.setLoginToken1(loginId);
        fragment.setLoginToken2(loginSecret);

        new AlertDialog.Builder(MainActivity.this)
                .setTitle("Gelukt")
                .setMessage("U bent ingelogd")
                .setCancelable(false)
                .setPositiveButton("oke", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).create().show();

        // Create fragment and give it an argument specifying the article it should show
        InlogAccountFragment newFragment = new InlogAccountFragment();
        Bundle args = new Bundle();
        newFragment.setArguments(args);

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);


        transaction.commit();

    }
    else

        new AlertDialog.Builder(MainActivity.this)
                .setTitle("Mislukt")
                .setMessage("Uw inloggegevens zijn incorrect")
                .setCancelable(false)
                .setPositiveButton("oke", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).create().show();
    {

    }
}

public void onFailure(Throwable t) {

    new AlertDialog.Builder(MainActivity.this)
            .setTitle("Er is iets fouts gegaan")
            .setMessage("Probeer opnieuw")
            .setCancelable(false)
            .setPositiveButton("oke", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            }).create().show();



}
public void doLogin(String email, String password){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("BLABLA")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Login service = retrofit.create(Login.class);

    service.loginResults(
            email,
            password

    ).enqueue(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_home) {

        HomeFragment fragment = new HomeFragment();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

    } else if (id == R.id.nav_favorieten) {

        FavoriteFragment fragment = new FavoriteFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

    } else if (id == R.id.nav_berichtenbox) {

        MessageFragment fragment = new MessageFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

    } else if (id == R.id.nav_account) {

        AccountFragment fragment = new AccountFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

    } else if (id == R.id.nav_instellingen) {

        SettingsFragment fragment = new SettingsFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();


    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


}

【问题讨论】:

  • 您可以使用 EventBus 库。 link

标签: android android-fragments button fragment onclicklistener


【解决方案1】:

我通常会尽量保持我的片段轻量级和解耦,并将繁重的工作(特别是与其他片段的交互)委托给使用它们的活动。您可能想尝试以下方法:

尝试向您的 AccountFragment 添加监听器接口 - 类似这样:

public interface Listener {
    void onStudentRegistrationSelected();
    void onVerhuurderRegistrationSelected();
}

您还需要添加:

// Member declaration at the top of the fragment class
private Listener mListener;

@Override public void onAttach(Context context) {
    super.onAttach(context);
    try {
        mListener = (Listener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString() + " must implement " +
                Listener.class.getSimpleName() + ".");
    }
}

这将设置使用片段作为监听器的活动。

然后,在AccountFragment 中设置相应按钮的点击处理程序,以在侦听器上调用相应的方法。像这样的:

view.findViewById(R.id.btnRegisterStudent).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mListener.onStudentRegistrationSelected();
    }
}

回到MainActivity,实现AccountFragment.Listener接口,覆盖监听器的方法,并在每个监听器方法覆盖中创建并提交适当的注册片段——例如,onStudentRegistrationSelected()将显示@987654329 @片段。此外,如果你将它添加到片段 backstack,那么如果用户在AccountFragmentStudent 上点击后退按钮,用户将返回到AccountFragment,这是一个很好的 UX。

希望有帮助!

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多