Android 替换 Fragment 中的 Fragment

2023-12-28

我有一个名为“我的个人资料片段”。 以及处理 ActionBar-Tabs 逻辑的 MainActivity。

In the “MeinProfilFragment”我已经放置了“登录过程”的逻辑.

用户成功登录后我想显示另一个 布局。

怎么做 ?有可能替换片段中的片段? 或者我是否必须调用 MainActivity 进行 UI 更新?

这是代码“主要活动”:

public class MainActivity extends Activity {

public static int selectedTab;

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

    ActionBar actionBar = getActionBar();

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);    
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(false);

    Tab meinProfil = actionBar.newTab().setText("Mein Profil");
    TabListener<MeinProfilFragment> tabListenerMeinProfil = new TabListener<MeinProfilFragment>(this,"Mein Profil",MeinProfilFragment.class);
    meinProfil.setTabListener(tabListenerMeinProfil);
    actionBar.addTab(meinProfil);

    Tab mitglieder = actionBar.newTab().setText("Mitglieder");
    TabListener<MitgliederFragment> tabListenerMitglieder = new TabListener<MitgliederFragment>(this,"Mitglieder",MitgliederFragment.class);
    mitglieder.setTabListener(tabListenerMitglieder);
    actionBar.addTab(mitglieder);

    Tab dinner = actionBar.newTab().setText("Dinner");
    TabListener<DinnerFragment> tabListenerDinner = new TabListener<DinnerFragment>(this,"Dinner",DinnerFragment.class);
    dinner.setTabListener(tabListenerDinner);
    actionBar.addTab(dinner);

    Tab community = actionBar.newTab().setText("Community");
    TabListener<CommunityFragment> tabListenerCommunity = new TabListener<CommunityFragment>(this,"Community",CommunityFragment.class);
    community.setTabListener(tabListenerCommunity);
    actionBar.addTab(community);

    if(savedInstanceState != null){
        actionBar.setSelectedNavigationItem(savedInstanceState.getInt("selectedTab"));
    }
}


private static class TabListener<T extends Fragment> implements ActionBar.TabListener
{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity,String tag,Class<T> clz) {
         mActivity = activity;
         mTag = tag;
         mClass = clz; 
    }
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        selectedTab = tab.getPosition();
        Fragment prevFragment;
        FragmentManager fm = mActivity.getFragmentManager();
        prevFragment = fm.findFragmentByTag(mTag); 
        if (prevFragment != null) { 
            mFragment = prevFragment; 
        }
        if(mFragment == null){
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment,mTag);
        }else{
            ft.attach(mFragment);
        }   
     }
    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        selectedTab = tab.getPosition();
        if(mFragment != null){
             ft.detach(mFragment);
        }else{
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment,mTag);
        }
    }
    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        selectedTab = tab.getPosition();
    }   
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("selectedTab", selectedTab);
}   

这是 MeinProfilFragment:

public class MeinProfilFragment extends Fragment implements OnClickListener{

EditText LoginEmail;
EditText LoginPassw;
Button LoginButton;
public boolean loggedIn = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.mein_profil_fragment,container, false);
    LoginEmail = (EditText) view.findViewById(R.id.login_email_input);
    LoginPassw = (EditText) view.findViewById(R.id.login_passwort_input);
    LoginButton  = (Button) view.findViewById(R.id.login_submit);
    LoginButton.setOnClickListener(this);
    return view;
}

@Override
public void onClick(View arg0) {
    switch(arg0.getId())
    {
        case R.id.login_submit:
            // Get Input Values:
            String login_email = LoginEmail.getText().toString();
            String login_passw = LoginPassw.getText().toString();
            if(login_email.length()<6 || login_passw.length()<4){
                return;
            }   
            Log.i("TEST","onClick: E-Mail: "+login_email+" \n Passwort: "+login_passw);
            new Login().execute(login_email,login_passw);
        break;
    }
}

private class Login extends AsyncTask<String,Void,JSONObject>
{
    @Override
    protected JSONObject doInBackground(String... params) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("xxxx");
        try{
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("mitglied_email",params[0]));
            nameValuePairs.add(new BasicNameValuePair("mitglied_passwort",params[1]));
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            String line = reader.readLine();
            JSONObject jsonData = new JSONObject(line);
            return jsonData;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        updateUi(result);
    }   
}

public void updateUi(JSONObject result)
{
    try {
        Log.i("TEST",result.getString("logged_in"));
        String loggedInFlag = result.getString("logged_in");
        if(loggedInFlag.equals("true")){
            // Richtige Angaben:
            Log.i("TEST","loggedInFlag EQ TRUE");
            loggedIn = true;

            // Here i want to replace this current fragment with another called e.g "ProfileFragment"

        }else{
            // Falsche Angaben:
            Log.i("TEST","loggedInFlag EQ FALSE");
            loggedIn = false;
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

In the 更新UI()我想显示/膨胀另一个用户界面的方法。

怎么做 ? 有没有办法“重新启动”片段进而 在 onCreateView() 中膨胀另一个 Fragment-Layout。

或者可以将 Fragment-Layout 替换为另一个 Fragment-Layout 在片段内?

最好的做法是什么?


您可以使用此替换片段

FragmentManager fragmentManager2 = getFragmentManager();
FragmentTransaction fragmentTransaction2 = fragmentManager2.beginTransaction();
DetailFragment fragment2 = new DetailFragment();
fragmentTransaction2.addToBackStack("xyz");
fragmentTransaction2.hide(MeinProfilFragment.this);
fragmentTransaction2.add(android.R.id.content, fragment2);
fragmentTransaction2.commit();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 替换 Fragment 中的 Fragment 的相关文章

  • Android Studio Canary 3.4 Canary 4:错误:功能插件不支持variant.getApplicationId()

    自从我在新版本上更新了我的项目以来Android Studio 3 4 金丝雀 4 gradle 同步失败 因为 ERROR variant getApplicationId is not supported by feature plug
  • Phonegap(应用程序错误...发生网络错误)

    我已经使用phonegap 创建了一个版本 在index html 文件中 我编写了一个简单的iframe 用于加载网站 当我从phonegap获取本地url时它就起作用了 但如果我将整个构建作为 zip 文件上传到 PhoneGap 中
  • Android 中图像字节表示的每像素字节数

    我目前正在编写一个Android应用程序 需要在其中使用OCR 为了实现这一点 我将 Tesseract 与tesseract android tools 项目 http code google com p tesseract androi
  • 将项目添加到 android 框架的设置中

    我正在 android 框架中工作 我想向 android 操作系统中的现有设置添加一个项目 您能告诉我如何执行此操作吗 首先阅读有关偏好活动 http developer android com reference android pre
  • Android 在 Windowmanager 中调整视图大小

    这是我的代码 menubuttonClosed li inflate R layout menu button null menubutton ImageButton menubuttonClosed findViewById R id m
  • 构建应用程序时出现 BufferOverflowException

    每次我想运行我的 Android 应用程序时 我都会收到错误 2013 11 02 13 05 36 Dex Loader Unable to execute dex java nio BufferOverflowException Che
  • Android Studio APK META-INF/BCKEY.DSA 中复制的重复文件

    我的代码构建得很好 但是当我尝试在调试中运行它时 出现以下错误 Error Execution failed for task app transformResourcesWithMergeJavaResForDebug com andro
  • 在 Android 中使用 AES 加密的最佳实践是什么?

    我为什么问这个问题 我知道人们对 AES 加密存在很多疑问 即使对于 Android 也是如此 如果您在网络上搜索 会发现很多代码片段 但在每个页面上 在每个 Stack Overflow 问题中 我都发现了另一个具有重大差异的实现 所以我
  • 检测设备方向

    我需要检测 Android 设备方向变化 而无需手动处理传感器数据 同时保持活动方向坚持某个方向 onConfigurationChange不会起作用 因为会让我的活动不旋转 通过使用传感器数据来检测方向变化 我认为这是轮子的发明 因为 A
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g
  • 如何防止应用程序被盗(针对Android应用程序)?

    我想知道防止人们窃取我的应用程序的最有效方法是什么 在线下载 apk 的副本而不是购买它 我已经花了一个lot特别是 Droidbox 上的时间 并且不会发布 Sync 直到我可以保证提供专业版本的非法副本的人无法发布 有人实施过这个吗 我
  • Android中如何使用intent加载本地html页面?

    我的 asset 目录中有一个 html 文件 我必须使用 Intent 将其加载为浏览器应用程序 这是我的代码 但它不起作用 startActivity new Intent Intent ACTION VIEW Uri parse fi
  • foo.setVisibility(View.GONE) 和parent.removeView(foo) 之间的区别

    如果 foo 是一个视图 那么有什么区别foo setVisibility View GONE and fooParent removeView foo 我对两个语句之前和之后视图的内存消耗特别感兴趣 可见性设置为 GONE 的视图是否会消
  • 如何获取Android中的所有主屏幕?

    我是安卓开发新手 我知道每个主屏幕都是启动器中的一个工作区 我想获取屏幕上所有应用程序图标的所有位置信息 那么有没有办法获取这些屏幕对象及其图标信息的列表 ADD 我更期待的是应用程序图标和屏幕之间的关系 例如 我想要某个应用程序图标的位置
  • SimpleDateFormat 无法解析的日期 如果语言环境为 ES,则会出现错误。推特“创建时间”

    我正在尝试将 Twitter created at 转换为阿根廷日期时间 如果我这样做 final String TWITTER EEE MMM dd HH mm ss SimpleDateFormat sf new SimpleDateF
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • 在 VideoView 开始播放之前,TextView 不会显示

    我编写了一个android应用程序 它有两个视图 TextView上方的VideoView 位于ScrollView内部 我遇到了一个问题 直到VideoView开始播放视频 TextView才显示 并且我有一个黑屏 这可能需要很长一段时间
  • 致命异常:GoogleApiHandler

    在我的项目中 我使用货币化服务 Vungle AppLovin 当我尝试加载广告时 出现此异常 E AndroidRuntime 致命异常 GoogleApiHandler 进程 kz ikar PID 3673 java lang NoS
  • 在两个片段之间拖放视图

    我目前正在尝试在两个片段之间实现拖放 我已经将它们添加到我的活动中 如下所示 FragmentManager fm getFragmentManager FragmentTransaction ft fm beginTransaction
  • FCM(Firebase Cloud Messaging)如何发送到所有手机?

    我创建了一个小型应用程序 能够从 FCM 控制台接收推送通知 我现在想做的是向所有使用 API 安装应用程序的 Android 手机发送推送通知 这就是我完全迷失的地方 有没有办法在不收集所有注册ID的情况下将其发送到所有手机 这是否仅适用

随机推荐