【问题标题】:Replace fragment in ActionBar Tabs that have swipe view替换具有滑动视图的 ActionBar 选项卡中的片段
【发布时间】:2013-04-06 19:31:38
【问题描述】:

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

我有一个带有滑动视图的 ActionBar 选项卡,根据 android training 实现。我的活动有 3 个标签 WeatherCommentDashboard 还有这些片段
WeatherFragmentCommentsFragmentLoginFragmentDasboardFragmentRegisterFragment

活动开始时, Weather Tab 显示 WeatherFragment , Comments Tab 显示 CommentsFragmentDashboard Tab 显示 LoginFragment

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

我是 android 开发的新手,所以任何代码 sn-ps 或教程将不胜感激

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

登录片段

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());
    }
}
}

【问题讨论】:

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


    【解决方案1】:

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

    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());
        }
    }
    }
    

    【讨论】:

    • 您好,感谢您的回复。我试过了,但没有用 :( 认为我需要对我的 AppSectionsPagerAdapter 实现某种回调方法。我在这里发现了一个类似的问题 [link] stackoverflow.com/questions/7723964/…
    • 但我在尝试将其实现到我的代码时不断出错。想看看那个答案的片段代码..任何建议..?
    • 我编辑了答案并输入了登录片段的代码,这是你想要的吗? if (success==0) 是我插入代码的地方。你得到了什么错误?
    • 我的意思是来自这个答案stackoverflow.com/questions/7723964/… 的代码片段,顺便说一句,我没有收到任何错误,但即使在成功登录后登录片段也不会改变。
    • 您是否尝试过实现该链接中的代码?完成后请分享您的代码,因为现在我无法想象您想将此代码包含在您的代码中的哪个位置。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多