如何在对话框活动中实现浮动操作按钮

时间:2018-08-15 06:33:13

标签: android dialog floating-action-button

我希望我的应用程序看起来像星巴克应用程序。

enter image description here

我想从浮动操作按钮开始。我创建活动布局如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.FloatingActionButton
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fabPuntos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="20dp"
android:src="@android:color/transparent"
app:backgroundTint="#CCCC00" >

我的Java代码

public class PuntosActivity extends Activity {

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

}

我已经在清单中声明了这样的活动

<activity android:name=".PuntosActivity"
        android:label="TUS PUNTOS"
        android:theme="@android:style/Theme.Dialog" />

我收到以下错误。怎么了?

08-15 00:17:05.066 9930-9930/com.cerveceriacc.clientappv2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cerveceriacc.clientappv2, PID: 9930
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cerveceriacc.clientappv2/com.cerveceriacc.clientappv2.PuntosActivity}: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown>
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown>
 Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
    at android.view.LayoutInflater.createView(LayoutInflater.java:647)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:461)
    at android.app.Activity.setContentView(Activity.java:2737)
    at com.cerveceriacc.clientappv2.PuntosActivity.onCreate(PuntosActivity.java:12)
    at android.app.Activity.performCreate(Activity.java:7174)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: java.lang.IllegalArgumentException: You need to use a Theme.AppCompat theme (or descendant) with the design library.
    at android.support.design.widget.ThemeUtils.checkAppCompatTheme(ThemeUtils.java:33)
    at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:164)
    at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:158)
    at java.lang.reflect.Constructor.newInstance0(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:334) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:647) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:461) 
    at android.app.Activity.setContentView(Activity.java:2737) 
    at com.cerveceriacc.clientappv2.PuntosActivity.onCreate(PuntosActivity.java:12) 
    at android.app.Activity.performCreate(Activity.java:7174) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6944) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

谢谢

1 个答案:

答案 0 :(得分:0)

从您的Logcat

  

原因:java.lang.IllegalArgumentException:您需要在设计库中使用Theme.AppCompat主题(或后代)。

这描述了您的问题。

在您的 PuntosActivity 中,您使用了主题 Theme.Dialog ,它不是AppCompat主题。尝试使用任何AppCompat主题。

使用 import com.jtattoo.plaf.hifi.HiFiLookAndFeel; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import java.awt.Container; import java.awt.Window; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JRootPane; import javax.swing.LookAndFeel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class A extends javax.swing.JFrame { public A() { initComponents(); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jFileChooser1 = new javax.swing.JFileChooser(); button = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); button.setText("jButton1"); button.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(128, 128, 128) .addComponent(button) .addContainerGap(195, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(71, 71, 71) .addComponent(button) .addContainerGap(197, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void buttonActionPerformed(java.awt.event.ActionEvent evt) { jFileChooser1.showOpenDialog(this); //jFileChooser1.showOpenDialog(null) has no problem } public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, InterruptedException, InvocationTargetException { UIManager.setLookAndFeel(new HiFiLookAndFeel()); SwingUtilities.invokeLater(new Runnable() { public void run() { try { A x = new A(); x.setVisible(true); x.button.doClick(); } catch (Exception ex) { ex.printStackTrace(); } } }); Thread.sleep(3000); changer.change(new WindowsLookAndFeel()); } // Variables declaration - do not modify private javax.swing.JButton button; private javax.swing.JFileChooser jFileChooser1; // End of variables declaration } class changer { public static void change(LookAndFeel laf) throws UnsupportedLookAndFeelException, InterruptedException, InvocationTargetException { UIManager.setLookAndFeel(laf); SwingUtilities.invokeLater(new Runnable() { public void run() { ArrayList<JFrame> frames = new ArrayList<>(); ArrayList<JDialog> dialogs = new ArrayList<>(); ArrayList<Window> winds = new ArrayList<>(); Window[] wins = Window.getWindows(); if (wins == null || wins.length == 0) { return; } for (int i = 0; i < wins.length; i++) { Class cls = wins[i].getClass(); if (JFrame.class.isAssignableFrom(cls)) { frames.add((JFrame) wins[i]); } else if (JDialog.class.isAssignableFrom(cls)) { dialogs.add((JDialog) wins[i]); } else { winds.add(wins[i]); } } boolean initialState = false; if (frames.size() > 0) { for (JFrame fr : frames) { fr.getRootPane().setWindowDecorationStyle(JRootPane.NONE); initialState = fr.isVisible(); fr.dispose(); fr.setUndecorated(false); SwingUtilities.updateComponentTreeUI(fr); fr.pack(); fr.setVisible(initialState); } } if (dialogs.size() > 0) { for (JDialog dia :dialogs) { dia.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); Container par = dia.getParent(); sop("par----"); sop(par); sop("disp:" + par.isDisplayable()); sop("vis:" + par.isVisible()); sop("show:" + par.isShowing()); sop("dia----"); sop("disp:" + dia.isDisplayable()); sop("vis:" + dia.isVisible()); sop("show:" + dia.isShowing()); initialState = dia.isVisible(); dia.dispose(); dia.setUndecorated(false); SwingUtilities.updateComponentTreeUI(dia); dia.pack(); dia.setVisible(initialState); } } } }); } public static void sop(Object obj) { System.out.println(obj); } } 作为活动主题。

Theme.AppCompat.Light.Dialog