简单对话框中的ViewPager [英] ViewPager in simple Dialog

查看:131
本文介绍了简单对话框中的ViewPager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在对话框中使用ViewPager,但是失败了!这是所有代码。对话框中将显示两个片段:

I would like to use a ViewPager in a dialog but fail epicly! Here is all the code. There is two fragments to be shown in the dialog:

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main" >

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="dialog" />

</RelativeLayout>

details.xml (片段布局)

<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/detailsText"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal|center_vertical"
    android:layout_marginTop="20dip"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textSize="30dip" />

</LinearLayout>

image.xml (片段布局)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/ic_launcher" />

</LinearLayout>

dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

<com.viewpagerindicator.CirclePageIndicator
    android:id="@+id/indicator"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip" />

</LinearLayout>

Main.java

public class Main extends FragmentActivity {

private Button button;

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

    setupUIComponents();
    setupListeners();
}

private void setupUIComponents() {
    button = (Button) findViewById(R.id.button);
}

private void setupListeners() {
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            MyDialog dialog = new MyDialog(Main.this);
            dialog.startDialog();
        }
    });
}
}

MyDialog.java

public class MyDialog extends FragmentActivity {

private Dialog dialog;
private Context context;
private CirclePageIndicator mIndicator;
private Main mMain;
private ViewPager mPager;
private FragmentAdapter mAdapter;

public MyDialog(Context context) {
    super();
    this.context = context;
    this.mMain = (Main) context;
}

public void startDialog() {
    dialog = new Dialog(context);
    dialog.setContentView(R.layout.dialog);

    mAdapter = new FragmentAdapter(mMain.getSupportFragmentManager());
    mPager = (ViewPager) dialog.findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    mIndicator = (CirclePageIndicator) dialog.findViewById(R.id.indicator);
    mIndicator.setViewPager(mPager);
    mIndicator.setCurrentItem(0);

    dialog.show();
}

}

FragmentAdapter.java

public class FragmentAdapter extends FragmentPagerAdapter {
public FragmentAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int which) {
    switch (which) {
        case 0:
            ImageFragment imageFragment = new ImageFragment();
            return imageFragment;
        case 1:
            DetailFragment detailsFragment = new DetailFragment();
            return detailsFragment;
    }
    return null;
}

@Override
public int getCount() {
    return 2;
}

}

DetailsFragment.java

public class DetailFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.details, container, false);
    TextView textView = (TextView) view.findViewById(R.id.detailsText);
    textView.setText("Testing");
    return view;
}
}

ImageFragment.java

public class ImageFragment extends Fragment {

public ImageFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.image, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageView1);
    imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
    return view;
}
}

要快速汇总代码,Main.java是首先,单击按钮将在视图寻呼机中启动一个包含两个片段的对话框。

To sum the code up quickly, Main.java is started, clicking on the button shall fire up a dialog with two fragments in a view pager.

有堆栈跟踪:

12-11 11:28:15.999: E/AndroidRuntime(7453): FATAL EXCEPTION: main
12-11 11:28:15.999: E/AndroidRuntime(7453): java.lang.IllegalArgumentException: No view found for id 0x7f040006 for fragment ImageFragment{410a2468 #0 id=0x7f040006 android:switcher:2130968582:0}
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:864)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.View.measure(View.java:15172)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1077)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.Choreographer.doFrame(Choreographer.java:525)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.os.Handler.handleCallback(Handler.java:615)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.os.Looper.loop(Looper.java:137)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at android.app.ActivityThread.main(ActivityThread.java:4966)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at java.lang.reflect.Method.invokeNative(Native Method)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at java.lang.reflect.Method.invoke(Method.java:511)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
12-11 11:28:15.999: E/AndroidRuntime(7453):     at dalvik.system.NativeStart.main(Native Method)

还是可以在对话框的viewpager中显示片段吗?如果是这样,我在哪里出错了?

Again, is it possible to show fragments in a viewpager in a dialog? And if so, where abouts did I go wrong?

推荐答案


再次,有可能显示

Again, is it possible to show fragments in a viewpager in a dialog?

是的,但是不是您尝试的方式(如果我的代码中没有缺少某些内容) ), ViewPager 将无法附加那些子 Fragments ,因为它已放置在对话框中。 4.2 API级别带来了嵌套片段(但在兼容软件包的新版本的较低版本中也可用),您应该使用它来显示对话框片段中。

Yes, but not the way you tried(if I'm not missing something in your code), the ViewPager will not be able to attach those child Fragments as it's placed in the dialog. The 4.2 API level brought nested Fragments(but also available on lower versions with the new versions of the compatibility package) which you should use to show your "in dialog fragments".

在您的 Main 活动中,您将创建一个 DialogFragment ,并在该 DialogFragment ,您将设置 ViewPager 并将 getChildFragmentManager()传递给其适配器。

In your Main activity you would create a DialogFragment and in that DialogFragment you would setup the ViewPager and pass getChildFragmentManager() to its adapter.

此外,只需在 Main 活动中使用 startDialog()方法移动不要实例化一个新的活动,因为这不是Android的工作方式(在您的情况下,它是可行的,因为您并未对其进行任何操作)

Also, just use move the startDialog() method in the Main activity and don't instantiate a new Activity as that is not the way Android goes(in your case it works because you're not doing anything with it).

这篇关于简单对话框中的ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆