【问题标题】:how to display dialog when moving from 1 tab to another - implementation uses Fragments in Android从一个选项卡移动到另一个选项卡时如何显示对话框 - 实现在 Android 中使用 Fragments
【发布时间】:2015-01-28 05:45:28
【问题描述】:

我创建了一个带有 3 个选项卡的片段活动。当我从标签 1 移动到标签 3 时,加载标签 3 大约需要 5 秒(由于一些耗时的任务)。在此加载期间,我想显示一个对话框。

我将对话框放在 onTabSelected() 中,但只有在第三个选项卡显示出现后才会显示对话框。我希望它显示在“我单击第三个选项卡的时间”和“第三个选项卡实际出现的时间”之间。请让我知道你的建议。

已编辑:

示例代码:

MainActivity.java:

package com.example.trial;

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.Window;

public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {

private static final String STATE_SELECTED_NAVIGATION_ITEM ="selected_navigation_item";
ProgressDialog nDialog;

Fragment dashboardFrag = new DashboardTab();
Fragment Tab1 = new Tab1();
Fragment Tab2 = new Tab2();


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_main);

final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

actionBar.addTab(actionBar.newTab().setText("Tab1")
    .setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Tab2")
    .setTabListener(this));

actionBar.addTab(actionBar.newTab().setText("Tab3")
    .setTabListener(this));

}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
getActionBar().setSelectedNavigationItem(
        savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
}
}

@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
    .getSelectedNavigationIndex());
}

@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {

}


@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {


if (tab.getPosition() == 0) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, Tab1).commit();    
}
else if (tab.getPosition() == 1) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, Tab2).commit();    
}
else if (tab.getPosition() == 2) {
showProgress1();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, dashboardFrag).commit();
}

}

void showProgress1(){
nDialog = new ProgressDialog(MainActivity.this); //Here I get an error: The     constructor ProgressDialog(PFragment) is undefined
nDialog.setMessage("Loading..");
nDialog.setTitle("Fetching Data");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.show();

}

@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
}

Tab1.java

package com.example.trial;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Tab1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.tab1, container, false);
    return rootView;
}

}

Tab2.java

package com.example.trial;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Tab2 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.tab2, container, false);
    return rootView;
}

}

DashboardTab.java

package com.example.trial;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class DashboardTab extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.dashboard, container, false);
    try {
        Thread.sleep(5*1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return rootView;
}

}

activity_main.xml

<FrameLayout android:id="@+id/container"  android:layout_height="match_parent" android:layout_width="match_parent" tools:context=".MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

</FrameLayout>

tab1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Tab1"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

tab2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="tab2"
    android:textAppearance="?android:attr/textAppearanceLarge" />

 </LinearLayout>

dashboard.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="dashBoard"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

【问题讨论】:

  • 您必须在片段上显示对话框或进度条,根据我的意见,您在其中使用耗时。
  • @Duggu 那是目标标签的内容。我想在那之前显示对话框。
  • 您必须在目标选项卡上显示您的耗时工作开始的对话框,并在您的工作完成后隐藏。
  • @Duggu 发生的情况是:显示选项卡 1 -> 单击选项卡 3 -> 显示 5 秒显示选项卡 1 -> 然后显示选项卡 3。 (标签 3 代码中的耗时部分)我想要的是:显示 Tab1 -> 单击标签 3 -> 开始对话框 -> 显示 5 秒显示 tab1 -> 在 tab3 中关闭 dailog。
  • 没有得到你和你现在想尝试的意味着想要在我认为不是正确的方法之前显示对话

标签: android android-fragments tabs


【解决方案1】:

我没有找到像您所说的那样,可能是您的手机内存有问题,但是通过您的代码执行耗时任务时显示对话框的方法

public class DashboardTab extends Fragment {

    private ProgressDialog nDialog;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.dashboard, container, false);

        showProgress1();
        YourTimeConsumingTask();
        nDialog.dismiss();

        return rootView;
    }

    private void YourTimeConsumingTask(){
        try {
            Thread.sleep(5 * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    void showProgress1() {
        nDialog = new ProgressDialog(getActivity()); // Here I get an error:
                                                            // The constructor
                                                            // ProgressDialog(PFragment)
                                                            // is undefined
        nDialog.setMessage("Loading..");
        nDialog.setTitle("Fetching Data");
        nDialog.setIndeterminate(false);
        nDialog.setCancelable(true);
        nDialog.show();

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多