替换具有滑动视图的ActionBar选项卡中的片段

时间:2013-04-06 19:31:38

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

我在这里做了一个快速搜索,没有找到我的qustion的任何答案,如果已经回答,请指出我的问题..

我有一个ActionBar标签,其中包含根据此android training实施的滑动视图。我的活动有3个标签 Weather Comment Dashboard 和这些碎片
WeatherFragment CommentsFragment LoginFragment DasboardFragment RegisterFragment

当活动开始时, Weather Tab显示WeatherFragmentComments Tab显示CommentsFragmentDashboard Tab显示LoginFragment

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

我是Android开发的新手,所以任何代码片段或教程都会非常感激

代码我到目前为止 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) {
 }
 }

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) {             
            // Replace LoginFragment and launch DashboardFragment ?                 
        } else {
            loginError.setText(jsonObject.getString("ErrorMessage"));
        }

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

2 个答案:

答案 0 :(得分:1)

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

public static boolean loggedIn = false;

(例如,ViewPager mViewPager;以下)

然后,当processFinish(...) LoginFragmentsuccess 0时,MainActivity.loggedIn = true;中的方法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()); } } } 只需设置{{1}}

这样你就可以在getItem-method中的default-case里面插入一个if语句来检查用户是否登录(如果这样调用Dashboard-Fragment)或者不显示(显示Login-Fragment)。 / p>

希望这适合你!

编辑:LoginFragment

{{1}}

答案 1 :(得分:1)

由于没有彻底阅读答案here,这是我自己的错。从该答案实现了代码并使功能正常工作:)