【问题标题】:How to make dialogFragment width match parent?如何使 dialogFragment 宽度匹配父级?
【发布时间】:2017-02-28 06:27:42
【问题描述】:

我有这个dialog fragmentt,我有两个问题。

1.如何使宽度匹配父级(请提供最干净和最佳的解决方案)。

  1. dialog fragment 我有一个editText。如何让它在对话框片段打开时弹出软键盘?

希望大家帮忙!

这是我的对话框片段 java 代码:

 @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        rootView  = inflater.inflate(R.layout.activity_13g_add_comment, container, false);//The container is the rootView.

        myCognito = new MyCognito(getActivity().getApplicationContext(),getActivity().getBaseContext());

        cardClient = myCognito.getCardClient();

        bindActivity();

        return rootView;
    }

    private void bindActivity()
    {
        doneButton = (ImageButton) rootView.findViewById(R.id.add_comment_doneButton);
        doneButton.setVisibility(View.GONE);

        imageView = (ImageView) rootView.findViewById(R.id.add_comment_IV);

        RemoveGlideCacheAsyncTask removeGlideCacheAsyncTask = new RemoveGlideCacheAsyncTask(getActivity().getBaseContext(),Global_Class.getInstance().getValue().user.getUsername());
        removeGlideCacheAsyncTask.execute();


        editText = (EditText) rootView.findViewById(R.id.add_comment_ET);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                enableSubmitButton();
            }

            @Override
            public void afterTextChanged(Editable s)
            {

            }
        });

        imageView = (ImageView) rootView.findViewById(R.id.add_comment_IV);

        doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {

            }
        });
    }

    private void enableSubmitButton()
    {
        boolean isReady = editText.getText().toString().length() > 0;
        if(isReady)
        {
            doneButton.setVisibility(View.VISIBLE);
        }
        else
        {
            doneButton.setVisibility(View.GONE);
        }
    }

这里是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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_margin="10dp">
        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:id="@+id/add_comment_IV"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Add a comment"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:textColor="@color/black"
            android:id="@+id/add_comment_ET"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="5dp"
            android:background="@android:color/transparent"
            android:maxLength="140"/>
        <ImageButton
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@color/green_main"
            android:id="@+id/add_comment_doneButton"/>
    </LinearLayout>
</LinearLayout>

【问题讨论】:

    标签: android xml android-layout android-xml android-dialogfragment


    【解决方案1】:

    如下打开DialogFragment

    SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
    SampleDialogFragment.setStyle(DialogFragment.STYLE_NO_FRAME, 0);
    SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");
    

    然后在DailogFragment覆盖onStart()方法如下

    @Override
    public void onStart() {
      super.onStart();
      getDialog().getWindow()
             .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }
    

    然后显示软键盘试试这个

    ((InputMethodManager) sampleedittext.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(
            sampleedittext, InputMethodManager.SHOW_IMPLICIT);
    

    或者你可以 为Dialog 创建自定义样式

    <style name="CustomDialog" parent="AppTheme" >
      <item name="android:windowNoTitle">true</item>
      <item name="android:windowFullscreen">true</item>
      <item name="android:windowIsFloating">true</item>
      <item name="android:windowCloseOnTouchOutside">true</item>
    </style>
    

    然后在对话框片段中使用该样式

    @Override public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
    }
    
    @Override public void onStart() {
      super.onStart();
      getDialog().getWindow()
        .setLayout(WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT);
    }
    
    SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
    SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");
    

    【讨论】:

    • 如果我这样做SampleDialogFragment.setStyle(DialogFragment.STYLE_NO_FRAME,0); then,对话框片段的背景将变为透明。
    • 您可以将backgroundcolor 设置为对话框的根视图或尝试编辑后的答案
    【解决方案2】:

    使用 appcompactDialog 并应用以下主题:

     <style name="dialogFullScreen" parent="@android:style/Theme.NoTitleBar.Fullscreen">
    
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
        <item name="android:windowFullscreen">true</item>
    
        <item name="android:windowNoTitle">true</item>
    
    </style>
    

    下面是java代码示例:

     AppCompatDialog dialogVideoView = new AppCompatDialog(context,R.style.dialogFullScreen);
     dialogVideoView.setContentView(R.layout.custom_dialog_video_surface);
     dialogVideoView.show();
    

    【讨论】:

      【解决方案3】:

      对于您的第一个问题,您可以将其添加到您的dialog stylestyle.xml

          <item name="android:windowNoTitle">true</item>  
          <item name="android:windowFullscreen">true</item>
      

      另外,你必须让你的EditText requestFocus 并显示键盘,这里是代码:

      edit.requestFocus();
      InputMethodManager imm = (InputMethodManager) edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
      imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED); 
      

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        对于自定义对话框,您可以使用:

        Dialog dialog_guest = new Dialog(MainActivity.this);
        
        dialog_guest.requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        dialog_guest.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        
        dialog_guest.setContentView(R.layout.yourxml);
        
        dialog_guest.setCanceledOnTouchOutside(false);
                dialog_guest.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        
        dialog_guest.show();
        

        我还认为你的键盘会自动打开。如果没有,则使用:

        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
                inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
                yourEditText.requestFocus();
        

        【讨论】:

          【解决方案5】:

          只需在片段布局中创建一个高度和宽度都非常大的视图:

          <View
              android:layout_width="1600dp"
              android:layout_height="1600dp"
              app:layout_constraintTop_toTopOf="parent"
              app:layout_constraintStart_toStartOf="parent" />
          

          然后在DialogFragment的onCreateView方法中添加如下代码:

          if (getDialog() != null && getDialog().getWindow() != null) {
              getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
              getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
          }
          

          使用ConstraintLayout 测试(因此它应该适用于所有类型的布局)。

          【讨论】:

            猜你喜欢
            • 2018-10-05
            • 2015-10-13
            • 1970-01-01
            • 1970-01-01
            • 2019-07-15
            • 1970-01-01
            • 2020-12-03
            • 2018-06-23
            • 2020-11-15
            相关资源
            最近更新 更多