我在这里进行了快速搜索,但找不到我的问题的答案,如果已经回答了,请指出该问题..

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

活动开始后,
Weather Tab显示WeatherFragment
Comments Tab显示CommentsFragment
Dashboard 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());
    }
}
}

最佳答案

我不确定这是否是处理此问题的最佳方法,但是您可以像这样在MainActivity中定义一个静态布尔值:

public static boolean loggedIn = false;


(例如ViewPager mViewPager;以下)

然后,在processFinish(...)LoginFragmentsuccess内的方法0中,只需设置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());
    }
}
}

10-08 07:39