#android
#Android
Вопрос:
Я пытаюсь показать вкладки с фрагментами внутри AlertDialog, но я не мог решить эту проблему, и я не понимал, что это вызывает.
Вот мой MainActivity.java
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.showDialog)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
View dialogView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_dialog,null);
TabLayout dialogTabLayout = (TabLayout)dialogView.findViewById(R.id.dialog_tablayout);
ViewPager dialogViewPager = (ViewPager) dialogView.findViewById(R.id.dialog_viewpager);
dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 1"));
dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 2"));
dialogViewPager.setAdapter(new DialogAdapter(getSupportFragmentManager()));
alertDialog.setView(dialogView);
alertDialog.show();
}
});
}
}
DialogFirst.java
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DialogFirst extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_first,container, false);
}
}
DialogSecond.java
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DialogSecond extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_second,container,false);
}
}
DialogAdapter.java
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
public class DialogAdapter extends FragmentStatePagerAdapter {
public DialogAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: return new DialogFirst();
case 1: return new DialogSecond();
default: return null;
}
}
@Override
public int getCount() {
return 2;
}
}
layout_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@ id/dialog_tablayout"/>
<android.support.v4.view.ViewPager
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/dialog_viewpager"/>
</LinearLayout>
dialog_first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Dialog 1"/>
</LinearLayout>
dialog_second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Dialog 2"/>
</LinearLayout>
Всякий раз, когда я запускаю код и нажимаю кнопку MainActivity, чтобы отобразить диалоговое окно, я получаю эту ошибку:
java.lang.IllegalArgumentException: No view found for id 0x7f0c007c (com.myapp.tabbeddialog:id/dialog_viewpager) for fragment DialogFirst{554e0d5 #0 id=0x7f0c007c}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1638)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1240)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1088)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19730)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:687)
at android.view.View.measure(View.java:19730)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1331)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1607)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Ответ №1:
Я обновил свой ответ
Сначала вам нужно расширить DialogFragment, потому что вы пытаетесь добавить viewpager с дочерним фрагментом внутри диалогового окна оповещения, которое по умолчанию является фрагментом, поэтому сначала
Создать класс PopUpDialogFragment extends DialogFragment
и внутри него добавьте следующее
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_dialog, container);
TabLayout dialogTabLayout = (TabLayout) view.findViewById(R.id.dialog_tablayout);
ViewPager dialogViewPager = (ViewPager) view.findViewById(R.id.dialog_viewpager);
dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 1"));
dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 2"));
FragmentManager manager = getChildFragmentManager();
dialogViewPager.setAdapter(new DialogAdapter(manager));
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return view;
}
и в OnClickListener в вашем представлении просто добавьте
new PopUpDialogFragment().show(getSupportFragmentManager(), PopUpDialogFragment.class.getSimpleName());
Счастливого кодирования
Комментарии:
1. здравствуйте, я добавил их сейчас.
2. @sinan-kna я добавил ответ, пожалуйста, дайте мне знать, работает ли он для вас
3. это с помощью DialogFragment работает, я тоже делал это раньше, но я хотел показать это как диалоговое окно оповещения, и я не смог, все равно спасибо
Ответ №2:
Используйте dialogTabLayout.setupWithViewPager(dialogViewPager)
, а не добавляйте вкладки вручную. Кроме того, поскольку у вас есть только 2 вкладки, вы должны использовать FragmentPagerAdapter
вместо FragmentStatePagerAdapter
.
Комментарии:
1. Можете ли вы попробовать выполнить все настройки после вызова
show()
? Возможно, он не может найти представления по идентификатору, потому что они еще не видны.2. Также попробуйте использовать
match_parent
для ширины видового пейджера или даже установить для него определенное значение dp.3. Я сделал все, что вы сказали, я пытался вызывать метод
show()
везде, и если я вызываю его доalertDialog.setView(dialogView)
того, как откроется диалоговое окно, но без чего-либо, просто экран становится немного прозрачно-черным, никакого окна нет.