未应用XML中的DialogFragment样式属性

时间:2016-09-13 10:28:20

标签: android

我想为具有这些属性的DialogFragments创建一个样式,但它们永远不会应用于我的DialogFragments

大小永远不会更改为100dp。正如您所看到的,我使用了android:widthlayout_width,但这些都没有做任何事情。

也不应用填充。

背景R.drawable.popup_rounded_frame只是圆角矩形的shape

它几乎可以工作,但背景也适用于我布局中的其他RelativeLayouts'背景。但它不能正常工作:getDialog().getWindow().setBackgroundDrawableResource(R.drawable.popup_rounded_frame);实际上删除了当前的背景并将其替换为您想要的背景。

<item name="android:background">@drawable/popup_rounded_frame</item>仅设置当前背景的背景!

我的DialogFragment样式

<style name="ArionDialogFragment" parent="Theme.AppCompat.Dialog">

    <item name="android:width">100dp</item>
    <item name="android:height">100dp</item>

    <item name="android:layout_width">100dp</item>
    <item name="android:layout_height">100dp</item>


    <item name="android:padding">16dp</item>
    <item name="android:background">@drawable/popup_rounded_frame</item>

</style>

这是我的DialogFragment的启动方式

  popuptest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            PopUP popUP = new PopUP();
            popUP.setStyle(DialogFragment.STYLE_NO_FRAME, R.style.ArionDialogFragment);
            popUP.show(getSupportFragmentManager(),"d");

        }
    });

这是扩展DialogFragment

PopUp
public class PopUP extends DialogFragment {


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.popup_connectsensor,container,false);


    return v;
}

它的外观如下:https://www.dropbox.com/s/8iy5b5t8ax293oo/Screenshot_20160913-123922.png?dl=0

4 个答案:

答案 0 :(得分:0)

我认为你做错了。您需要在创建对话框时应用样式。像这样:

public static class AwesomeDialogFragment extends DialogFragment {

    public static AwesomeDialogFragment newInstance() {
        AwesomeDialogFragment f = new AwesomeDialogFragment();
        f.setArguments(new Bundle(0));
        return f;
    }

    @SuppressLint("InflateParams")
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity(), R.style.YourStyle)
                .setView(getActivity().getLayoutInflater().inflate(R.layout.your_layout, null))
                .setPositiveButton(R.string.btn_done, null)
                .setNegativeButton(R.string.btn_cancel, null)
                .setCancelable(false)
                .create();
    }
}

您需要覆盖onCreateDialog()。通过这种方式,您可以应用自定义样式。

您可以通过以下方式调用您的片段:

AwesomeDialogFragment.newInstance().show(getSupportFragmentManager(), "your_tag");

答案 1 :(得分:0)

尝试将

放入

setStyle(DialogFragment.STYLE_NO_FRAME, R.style.ArionDialogFragment)

PopUP类中onCreate()方法内的代码。

@Override 
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setStyle(DialogFragment.STYLE_NO_FRAME,R.style.ArionDialogFragment); 
}

这会让对话框正确应用您想要的样式。

答案 2 :(得分:0)

尝试一下:

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

    //the following line has to be placed before the inflater gets created
    getContext().getTheme().applyStyle(R.style.ArionDialogFragment, true);
    View v = inflater.inflate(R.layout.popup_connectsensor, container, false);

    return v;

}

答案 3 :(得分:0)

class YourDialogFragment : DialogFragment()   
override fun getTheme(): Int {
        return R.style.YourStyleDialog
}