android - 替换具有滑动 View 的 ActionBar 选项卡中的 fragment

标签 android android-fragments android-actionbar android-viewpager android-tabs

我在这里进行了快速搜索,但没有找到我的问题的任何答案,如果它已经得到解答,请指出该问题..

我有一个 ActionBar 选项卡,其中带有根据此实现的滑动 View android training 。我的 Activity 有 3 个选项卡 天气 评论 仪表板 还有这些 fragment
WeatherFragment CommentsFragment LoginFragment DasboardFragment RegisterFragment

Activity 开始后, Weather Tab 显示 WeatherFragmentComments Tab 显示 CommentsFragmentDashboard Tab 显示 LoginFragment

如果在 LoginFragment 中登录成功,DasboardFragment 应替换 Dashboard 选项卡内的 LoginFragment。因此,如果用户滑动到其他选项卡并返回到 Dashboard Tab DasboardFragment 应该可见。

我是 Android 开发新手,因此任何代码 fragment 或教程将不胜感激

到目前为止我的代码MainActivity类

public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {

AppSectionsPagerAdapter mAppSectionsPagerAdapter;
ViewPager mViewPager;

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

    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(
            getSupportFragmentManager());

    final ActionBar actionBar = getActionBar();
    //actionBar.setDisplayShowTitleEnabled(false);
    //actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mAppSectionsPagerAdapter);
    mViewPager
            .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {                      
                    actionBar.setSelectedNavigationItem(position);
                }
            });

    for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {         
        actionBar.addTab(actionBar.newTab()
                .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }       
}

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

    public AppSectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
        case 0:
            return new WeatherInfoFragment();
        case 1:
            return new PostsFragment();
        default: //TODO method to find which fragment to display ?
            return new LoginFragment();
        }
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (position == 0) {
            return "Weather";
        } else if (position == 1){
            return "Comments";
        }
        else{
            return "Dashboard";
        }
    }
}

@Override
public void onTabReselected(ActionBar.Tab tab,
        android.app.FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
 }
 }

登录 fragment

public class LoginFragment extends Fragment implements AsyncResponse {
Button loginButton;
TextView loginError, login_url;
JSONfunctions task;
JSONObject jsonObject;

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

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

@Override
public void onStart() {
    super.onStart();

    loginButton = (Button) getView().findViewById(R.id.button_login);
    loginError = (TextView) getView().findViewById(R.id.login_error);

    loginButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {               
            attemptLogin(finalLoginUrl);
            // attemptPost(postURL);
        }
    });
}

private void attemptLogin(String url) {     
        try {
            task = new JSONfunctions(getActivity());
            task.listener = this;
            task.execute(new String[] { url });
        } catch (Exception ex) {
            Log.e("attempt login", ex.getMessage());
        }
    }
}

@Override
public void processFinish(String result) {
    try {
        jsonObject = new JSONObject(result);
        int success = Integer.parseInt(jsonObject.getString("Success"));
        if (success == 0) {             
            // Replace LoginFragment and launch DashboardFragment ?                 
        } else {
            loginError.setText(jsonObject.getString("ErrorMessage"));
        }

    } catch (JSONException e) {
        Log.e("JSON parsing from login result", e.getMessage());
    }
}
}

最佳答案

我不确定这是处理此问题的最佳方法,但您可以在 MainActivity 中定义一个静态 bool 值,如下所示:

public static boolean loggedIn = false;

(例如下面的ViewPager mViewPager;)

然后,在 LoginFragment 内的方法 processFinish(...) 中,当 success0 时只需设置 MainActivity.loggedIn = true;

这样,您可以简单地在 getItem-method 的默认情况下放入 if 语句来检查用户是否已登录(如果是,则调用 Dashboard-Fragment)或未登录(显示 Login-Fragment)。

希望这对您有用!

编辑:LoginFragment

public class LoginFragment extends Fragment implements AsyncResponse {
Button loginButton;
TextView loginError, login_url;
JSONfunctions task;
JSONObject jsonObject;

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

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

@Override
public void onStart() {
    super.onStart();

    loginButton = (Button) getView().findViewById(R.id.button_login);
    loginError = (TextView) getView().findViewById(R.id.login_error);

    loginButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {               
            attemptLogin(finalLoginUrl);
            // attemptPost(postURL);
        }
    });
}

private void attemptLogin(String url) {     
    try {
        task = new JSONfunctions(getActivity());
        task.listener = this;
        task.execute(new String[] { url });
    } catch (Exception ex) {
        Log.e("attempt login", ex.getMessage());
    }
}

@Override
public void processFinish(String result) {
    try {
        jsonObject = new JSONObject(result);
        int success = Integer.parseInt(jsonObject.getString("Success"));
        if (success == 0) {             
            MainActivity.loggedIn = true;                 
        } else {
            loginError.setText(jsonObject.getString("ErrorMessage"));
        }

    } catch (JSONException e) {
        Log.e("JSON parsing from login result", e.getMessage());
    }
}
}

关于android - 替换具有滑动 View 的 ActionBar 选项卡中的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15855123/

相关文章:

java - 如何解决ThreeTenABP中的ExceptionInInitializerError和ZoneRulesException?

被另一个 fragment 覆盖的 Android fragment 仍然显示而不是 onPause

安卓 3.0 : cannot style Action Bar 's action item buttons

android - 在每个 Activity 的操作栏上设置图标

android - 如何检测 Android 中 TextView 的重叠和重置位置?

android - 如何隐藏应用程序图标但在 Action Bar Android 中保留向上按钮

java - 我无法通过我的应用程序从 firebase 检索动态链接,因为 pendingdynamiclinkdata 为 null

java - 如何在android中使用AES算法存储用于加密文件的 key

java - RSA 加密编码使用 Android 解密使用 apache 编解码器问题

android - setUserVisibleHint 方法在 onCreateView 方法之前调用,并且在第一次加载时不起作用