【问题标题】:Call a Fragment implements View.OnClickListener in a drawermenu在drawermenu中调用Fragment实现View.OnClickListener
【发布时间】:2016-10-15 06:43:13
【问题描述】:

我正在尝试通过抽屉菜单调用 Fragment 实现 View.OnClickListener。

主要代码:

     package thyroid.com.thyroidmenu;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

private String[] mNavigationDrawerItemTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
Toolbar toolbar;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
android.support.v7.app.ActionBarDrawerToggle mDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTitle = mDrawerTitle = getTitle();
    mNavigationDrawerItemTitles= getResources().getStringArray(R.array.navigation_drawer_items_array);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    setupToolbar();

    DataModel[] drawerItem = new DataModel[3];

    drawerItem[0] = new DataModel(R.drawable.connect, "Connect");
    drawerItem[1] = new DataModel(R.drawable.fixtures, "Fixtures");
    drawerItem[2] = new DataModel(R.drawable.table, "Table");
    drawerItem[3] = new DataModel(R.drawable.table, "Table");
    drawerItem[4] = new DataModel(R.drawable.fixtures, "Table");
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    getSupportActionBar().setHomeButtonEnabled(true);

    DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.list_view_item_row, drawerItem);
    mDrawerList.setAdapter(adapter);
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    setupDrawerToggle();


}

private class DrawerItemClickListener implements ListView.OnItemClickListener {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }

}

private void selectItem(int position) {

    RegisterFragment fragment = null;

    switch (position) {
        case 0:
            fragment = new ConnectFragment();
            break;
        case 1:
            fragment = new FixturesFragment();
            break;
        case 2:
            fragment = new TableFragment();
            break;
        case 3:
            fragment = new LoginFragment();
            break;
        case 4:
            fragment = new RegisterFragment();
            break;

        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(mNavigationDrawerItemTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    } else {
        Log.e("MainActivity", "Error in creating fragment");
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getSupportActionBar().setTitle(mTitle);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}

void setupToolbar(){
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

void setupDrawerToggle(){
    mDrawerToggle = new android.support.v7.app.ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.app_name, R.string.app_name);
    //This is necessary to change the icon of the Drawer Toggle upon state change.
    mDrawerToggle.syncState();
}

}

还有我有问题的片段代码:

    package thyroid.com.thyroidmenu;


import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.AppCompatButton;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
 import android.view.ViewGroup;
import android.widget.EditText;
 import android.widget.ProgressBar;
import android.widget.TextView;


 import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import thyroid.com.thyroidmenu.models.ServerRequest;
import thyroid.com.thyroidmenu.models.ServerResponse;
import thyroid.com.thyroidmenu.models.User;


public class LoginFragment extends Fragment implements View.OnClickListener{

private AppCompatButton btn_login;
private EditText et_email,et_password;
private TextView tv_register,tv_reset_password;
private ProgressBar progress;
private SharedPreferences pref;


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

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

private void initViews(View view){

    pref = getActivity().getPreferences(0);

    btn_login = (AppCompatButton)view.findViewById(R.id.btn_login);
    tv_register = (TextView)view.findViewById(R.id.tv_register);
    tv_reset_password = (TextView)view.findViewById(R.id.tv_reset_password);
    et_email = (EditText)view.findViewById(R.id.et_email);
    et_password = (EditText)view.findViewById(R.id.et_password);

    progress = (ProgressBar)view.findViewById(R.id.progress);

    btn_login.setOnClickListener(this);
    tv_register.setOnClickListener(this);
    tv_reset_password.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    switch (view.getId()){



        case R.id.tv_register:
            goToRegister();
            break;

        case R.id.btn_login:
            String email = et_email.getText().toString();
            String password = et_password.getText().toString();

            if(!email.isEmpty() && !password.isEmpty()) {

                progress.setVisibility(View.VISIBLE);
                loginProcess(email,password);

            } else {

                Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();
            }
            break;
        case R.id.tv_reset_password:
            goToResetPassword();
            break;
    }
}
private void loginProcess(String email,String password){

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RequestInterface requestInterface = retrofit.create(RequestInterface.class);

    User user = new User();
    user.setEmail(email);
    user.setPassword(password);
    ServerRequest request = new ServerRequest();
    request.setOperation(Constants.LOGIN_OPERATION);
    request.setUser(user);
    Call<ServerResponse> response = requestInterface.operation(request);

    response.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

            ServerResponse resp = response.body();
            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

            if(resp.getResult().equals(Constants.SUCCESS)){
                SharedPreferences.Editor editor = pref.edit();
                editor.putBoolean(Constants.IS_LOGGED_IN,true);
                editor.putString(Constants.EMAIL,resp.getUser().getEmail());
                editor.putString(Constants.NAME,resp.getUser().getName());
                editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id());
                editor.apply();
                goToProfile();

            }
            progress.setVisibility(View.INVISIBLE);
        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {

            progress.setVisibility(View.INVISIBLE);
            Log.d(Constants.TAG,"failed");
            Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();

        }
    });
}

private void goToResetPassword(){

    Fragment reset = new ResetPasswordFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,reset);
    ft.commit();
}

private void goToRegister(){

    Fragment register = new RegisterFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,register);
    ft.commit();
}

private void goToProfile(){

    Fragment profile = new ProfileFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,profile);
    ft.commit();
}
 }

我的错误:

“错误:(81, 28) 错误:不兼容的类型:LoginFragment 无法转换为 RegisterFragment” 我怎么能称这个片段?我应该修改所有内容吗?

【问题讨论】:

  • 你到底有什么问题?应用程序会崩溃吗?什么都没有发生?
  • @Malith 错误显示 *edit thx
  • 根据您发布的代码,您在 selectFragment() 方法中创建的片段必须是 RegisterFragment。确保 switch 语句中的所有类都扩展了 RegisterFragment。
  • 每个扩展的片段都已经喜欢它了:"public class FixturesFragment extends Fragment" 并且它可以工作,但在这里"public class LoginFragment extends Fragment implements View.OnClickListener{" 我有错误...

标签: android android-fragments layout fragment navigation-drawer


【解决方案1】:

错误的是,您尝试将所有片段转换为 RegisterFragment,但它们没有扩展该类。

您应该将它们转换为Fragment

private void selectItem(int position) {

    Fragment fragment = null;

    switch (position) {
        case 0:
            fragment = new ConnectFragment();
            break;
        case 1:
            fragment = new FixturesFragment();
            break;
        case 2:
            fragment = new TableFragment();
            break;
        case 3:
            fragment = new LoginFragment();
            break;
        case 4:
            fragment = new RegisterFragment();
            break;

        default:
            break;
    }

    ...
}

【讨论】:

  • 嗨,胡安,谢谢你的回复,我修改了它,但我还是这样:“错误:(81, 28) 错误:不兼容的类型:LoginFragment 无法转换为片段”... ; )
  • 确保在你的导入中有import android.app.Fragment;。可能您正在尝试使用支持片段
  • 我无法导入这个“import android.support.v4.app.Fragment; in my LoginFragment”。那是我在 LoginFragment 中的公共类“公共类 LoginFragment 扩展 android.support.v4.app.Fragment 实现 View.OnClickListener{” 仍然有错误...
  • 检查您的 Activity 和 LoginFragment 中是否有相同的导入。 android.app.Fragmentandroid.support.v4.app.Fragment,如果它们相同,您的代码应该可以工作
  • 完成但仍然无法正常工作...我将文件上传到那里:filedropper.com/thyroidmenu 如果你想检查(只是比问题更多的片段)。这是一个.rar,ty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多