QT 扁平化介面風格,自定義TabWidget控制元件
直接上圖先看效果:
核心程式碼:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtCharts> QT_CHARTS_USE_NAMESPACE #include <QMainWindow> #include <QMdiArea> #include <QToolButton> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QChart *tpChart; //定義一個圖表 QMdiArea *tpMdiArea; //TabWidget子視窗 QLineSeries *CH1series; //通道1按鈕線 QLineSeries *CH2series; //通道2按鈕線 QLineSeries *CH3series; //通道3按鈕線 QLineSeries *CH4series; //通道4按鈕線 QLineSeries *CH5series; //通道5按鈕線 QLineSeries *CH6series; //通道6按鈕線 QLineSeries *CH7series; //通道7按鈕線 QLineSeries *CH8series; //通道8按鈕線 QGraphicsSimpleTextItem *m_coordX; //滑鼠在圖表上的X位置 QGraphicsSimpleTextItem *m_coordY; //滑鼠在圖表上的Y位置 QPushButton *changeBtn; QToolButton *closeBtn; QToolBar *mainToolBar; //主工具欄 QAction *actionFile; //工具欄檔案按鈕 QAction *actionTestPro; //工具欄測量工程按鈕 QAction *actionForceStart; //工具欄強制觸發按鈕 QAction *actionRealTimeData; //工具欄實時資料按鈕 QAction *actionStart; //工具欄啟動按鈕 QAction *actionStartN; //工具欄多次啟動按鈕 QAction *actionStop; //工具欄停止按鈕 QAction *actionStore; //工具欄儲存按鈕 QAction *actionTestPara; //工具欄測量引數按鈕 public: void WriteSettings(); void ReadSettings(); void init_sig_slots(); void uninit_sig_slots(); private slots: void on_clickCH(); void on_changeBtn_clicked(); void timerSingleClick(); //定時器事件,處理單擊任務 protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); public: QTimer* pQTimerDoubleClicked; //判斷單雙擊的定時器 int isDoubleClicked; //區分是單擊還是雙擊 bool isEnabledCH1series; //通道1是否正在繪圖 bool isEnabledCH2series; //通道2是否正在繪圖 bool isEnabledCH3series; //通道3是否正在繪圖 bool isEnabledCH4series; //通道4是否正在繪圖 bool isEnabledCH5series; //通道5是否正在繪圖 bool isEnabledCH6series; //通道6是否正在繪圖 bool isEnabledCH7series; //通道7是否正在繪圖 bool isEnabledCH8series; //通道8是否正在繪圖 bool m_Drag; //判斷滑鼠左鍵是否按下 QPoint m_DragPosition; //拖動視窗的位置 }; #endif // MAINWINDOW_H
mainwindow.cpp
main.cpp#include "mainwindow.h" #include "ui_mainwindow.h" #include <QSettings> #include <QDebug> #include <QTextCodec> #include <QLineSeries> #include <QSplineSeries> #include <QGraphicsScene> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_coordX(0), m_coordY(0), tpChart(0), ui(new Ui::MainWindow) { ui->setupUi(this); tpMdiArea = new QMdiArea; this->setCentralWidget(tpMdiArea); QMdiSubWindow *subWin = new QMdiSubWindow; subWin->setWidget(ui->tabWidget); subWin->setAttribute(Qt::WA_DeleteOnClose); tpMdiArea->addSubWindow(subWin); subWin->setWindowFlags(Qt::FramelessWindowHint); subWin->show(); //ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); ui->tabWidget->setTabText(2,tr("C:\\MyData\\Test.wav")); tpChart = new QChart; tpChart->setTitle("TP System Chart"); ui->chart->setFixedWidth(1200); ui->chart->setFixedHeight(400); ui->chart->setChart(tpChart); ui->tabWidget->setFixedWidth(1400); m_coordX = new QGraphicsSimpleTextItem(tpChart); m_coordX->setPos(tpChart->size().width()/2 - 50, tpChart->size().height()); m_coordX->setText("X: "); m_coordY = new QGraphicsSimpleTextItem(tpChart); m_coordY->setPos(tpChart->size().width()/2 + 50, tpChart->size().height()); m_coordY->setText("Y: "); for(int i=0; i<ui->tabWidget->count(); i++) { changeBtn = new QPushButton; QIcon button_icogrey("images/greyIco.png"); changeBtn->setObjectName("btnC"+QString::number(i)); changeBtn->setMinimumSize(16,16); changeBtn->setMaximumSize(16,16); changeBtn->setIcon(button_icogrey); changeBtn->setIconSize(QSize(16,16)); QObject::connect(changeBtn, SIGNAL(clicked(bool)),this,SLOT(on_changeBtn_clicked())); ui->statusBar->addWidget(changeBtn); } isDoubleClicked = 0; //初始化不點選 pQTimerDoubleClicked = new QTimer(this); //新建定時器 isEnabledCH1series = false; isEnabledCH2series = false; isEnabledCH3series = false; isEnabledCH4series = false; isEnabledCH5series = false; isEnabledCH6series = false; isEnabledCH7series = false; isEnabledCH8series = false; //初始化工具欄和對應的圖示 mainToolBar = new QToolBar(this); actionFile = new QAction(this); actionFile->setIcon(QIcon(":/images/file.png")); actionTestPro = new QAction(this); actionTestPro->setIcon(QIcon(":/images/testProject.png")); actionForceStart = new QAction(this); actionForceStart->setIcon(QIcon(":/images/forceS.png")); actionRealTimeData = new QAction(this); actionRealTimeData->setIcon(QIcon(":/images/realTimedata.png")); actionStart = new QAction(this); actionStart->setIcon(QIcon(":/images/start.png")); actionStartN = new QAction(this); actionStartN->setIcon(QIcon(":/images/startN.png")); actionStop = new QAction(this); actionStop->setIcon(QIcon(":/images/stop.png")); actionStore = new QAction(this); actionStore->setIcon(QIcon(":/images/store.png")); actionTestPara = new QAction(this); actionTestPara->setIcon(QIcon(":/images/testPara.png")); //建立主工具欄按鈕 mainToolBar->addAction(actionFile); mainToolBar->addAction(actionTestPro); mainToolBar->addAction(actionForceStart); mainToolBar->addAction(actionRealTimeData); mainToolBar->addAction(actionStart); mainToolBar->addAction(actionStartN); mainToolBar->addAction(actionStop); mainToolBar->addAction(actionStore); mainToolBar->addAction(actionTestPara); mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); ReadSettings();//讀取配置檔案 工具欄按鈕文字資訊 // QLabel *Titlelabel = new QLabel(this); // Titlelabel->setText(tr(" 虛擬儀器平臺")); closeBtn = new QToolButton(this); QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton); closeBtn->setIcon(closePix); int width = this->width(); closeBtn->setGeometry(width-25,5,1400,20); closeBtn->setToolTip(tr("關閉")); closeBtn->setStyleSheet("background-color:transparent;"); QHBoxLayout *hbox = new QHBoxLayout(this); // hbox->addWidget(Titlelabel); // hbox->addWidget(closeBtn); mainToolBar->setStyleSheet("background-color:transparent;"); //hbox->addWidget(mainToolBar); setLayout(hbox);\ addToolBar(mainToolBar); init_sig_slots();//初始化槽函式 } void MainWindow::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_Drag = true; m_DragPosition = event->globalPos() - this->pos(); event->accept(); } } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if (m_Drag && (event->buttons() && Qt::LeftButton)) { move(event->globalPos() - m_DragPosition); event->accept(); } } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { m_Drag = false; event->accept(); } void MainWindow::init_sig_slots() { QObject::connect(ui->btnCH1, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH2, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH3, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH4, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH5, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH6, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH7, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(ui->btnCH8, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::connect(pQTimerDoubleClicked,SIGNAL(timeout()),this,SLOT(timerSingleClick())); //關聯定時器和槽函式 QObject::connect(closeBtn, SIGNAL(clicked()), this, SLOT(close())); //關閉視窗和槽函式 } void MainWindow::uninit_sig_slots() { QObject::disconnect(ui->btnCH1, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH2, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH3, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH4, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH5, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH6, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH7, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); QObject::disconnect(ui->btnCH8, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); for(int i=0; i<ui->tabWidget->count(); i++) { QObject::disconnect(changeBtn, SIGNAL(clicked(bool)),this,SLOT(on_clickCH())); } } MainWindow::~MainWindow() { delete ui; delete tpChart;//刪除chart tpChart = NULL; uninit_sig_slots(); } void MainWindow::WriteSettings() { //do not implement } void MainWindow::ReadSettings() { QSettings *configIniRead = new QSettings("cfgs/cfg.ini", QSettings::IniFormat); //將讀取到的ini檔案儲存在QString中,先取值,然後通過toString()函式轉換成QString型別 configIniRead->setIniCodec(QTextCodec::codecForName("GB2312"));//設定編碼格式 actionFile->setText(configIniRead->value("/ToolBarText/file").toString()); actionFile->setStatusTip(configIniRead->value("/ToolBarText/file").toString()); actionTestPro->setText(configIniRead->value("ToolBarText/testProject").toString()); actionTestPro->setStatusTip(configIniRead->value("ToolBarText/testProject").toString()); actionForceStart->setText(configIniRead->value("ToolBarText/forceStart").toString()); actionForceStart->setStatusTip(configIniRead->value("ToolBarText/forceStart").toString()); actionRealTimeData->setText(configIniRead->value("ToolBarText/realTimeData").toString()); actionRealTimeData->setStatusTip(configIniRead->value("ToolBarText/realTimeData").toString()); actionStart->setText(configIniRead->value("ToolBarText/start").toString()); actionStart->setStatusTip(configIniRead->value("ToolBarText/start").toString()); actionStartN->setText(configIniRead->value("ToolBarText/startN").toString()); actionStartN->setStatusTip(configIniRead->value("ToolBarText/startN").toString()); actionStop->setText(configIniRead->value("ToolBarText/stop").toString()); actionStop->setStatusTip(configIniRead->value("ToolBarText/stop").toString()); actionStore->setText(configIniRead->value("ToolBarText/store").toString()); actionStore->setStatusTip(configIniRead->value("ToolBarText/store").toString()); actionTestPara->setText(configIniRead->value("ToolBarText/testPara").toString()); actionTestPara->setStatusTip(configIniRead->value("ToolBarText/testPara").toString()); //讀入入完成後刪除指標 delete configIniRead; } void MainWindow::timerSingleClick() { isDoubleClicked = 0; //先初始化 pQTimerDoubleClicked->stop(); //先初始化 } void MainWindow::on_clickCH() { QPushButton *pt = qobject_cast <QPushButton*>(sender()); if(!pt) return; if(pt == ui->btnCH1) { isDoubleClicked++; if(isDoubleClicked==1){//430ms為自己設定 pQTimerDoubleClicked->start(430); } if (isEnabledCH1series && (isDoubleClicked==2)){ tpChart->removeSeries(CH1series); isEnabledCH1series = false; QPalette pal; pal.setColor(QPalette::ButtonText, QColor(176,176,176)); ui->btnCH1->setPalette(pal); } if(isDoubleClicked==2 && !isEnabledCH1series) { isDoubleClicked = 0; //先初始化 pQTimerDoubleClicked->stop();//先初始化 CH1series = new QLineSeries; CH1series->append(1, 3); CH1series->append(4, 5); CH1series->append(5, 4.5); CH1series->append(7, 1); CH1series->append(11, 2); tpChart->addSeries(CH1series); tpChart->setAnimationOptions(QChart::AllAnimations); tpChart->legend()->hide(); tpChart->createDefaultAxes(); isEnabledCH1series = true; } } if(pt == ui->btnCH2) { CH2series = new QSplineSeries; CH2series->append(0, 1); CH2series->append(1, 2); CH2series->append(4, 6); CH2series->append(8, 4); CH2series->append(11, 3.5); CH2series->append(16, 3); tpChart->addSeries(CH2series); tpChart->setAnimationOptions(QChart::AllAnimations); tpChart->legend()->hide(); tpChart->createDefaultAxes(); } if(pt == ui->btnCH3) { CH3series = new QSplineSeries; CH3series->append(0, 3); CH3series->append(1, 4); CH3series->append(2, 6); CH3series->append(3, 5); CH3series->append(8, 9); CH3series->append(15, 10); tpChart->addSeries(CH3series); tpChart->setAnimationOptions(QChart::AllAnimations); tpChart->legend()->hide(); tpChart->createDefaultAxes(); } if(pt == ui->btnCH4) { CH4series = new QSplineSeries; CH4series->append(0, 6.5); CH4series->append(5, 3); CH4series->append(8, 7); CH4series->append(7, 8); CH4series->append(13, 9); CH4series->append(14, 11); tpChart->addSeries(CH4series); tpChart->setAnimationOptions(QChart::AllAnimations); tpChart->legend()->hide(); tpChart->createDefaultAxes(); } } void MainWindow::on_changeBtn_clicked() { QPushButton *pt = qobject_cast <QPushButton*>(sender()); if(!pt) return; if(pt->objectName() == "btnC0" )//第1個按鈕點選觸發 { ui->tabWidget->setCurrentIndex(0); QIcon button_icowhite("images/whiteIco.png"); pt->setMinimumSize(16,16); pt->setMaximumSize(16,16); pt->setIcon(button_icowhite); pt->setIconSize(QSize(16,16)); } if(pt->objectName() == "btnC1" )//第2個按鈕點選觸發 { ui->tabWidget->setCurrentIndex(1); QIcon button_icowhite("images/whiteIco.png"); pt->setMinimumSize(16,16); pt->setMaximumSize(16,16); pt->setIcon(button_icowhite); pt->setIconSize(QSize(16,16)); } if(pt->objectName() == "btnC2" )//第3個按鈕點選觸發 { ui->tabWidget->setCurrentIndex(2); QIcon button_icowhite("images/whiteIco.png"); pt->setMinimumSize(16,16); pt->setMaximumSize(16,16); pt->setIcon(button_icowhite); pt->setIconSize(QSize(16,16)); } }
#include "mainwindow.h" #include <QApplication> #include <QTranslator> #include <QFile> #include <QMessageBox> #include <tptabwidget.h> #include <QtCharts> using namespace QtCharts; int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("tpsystem.qm"); //載入國際化語言 a.installTranslator(&qtTranslator); //loading skin from qss file QFile qssFile("images/default.qss"); if(!qssFile.open(QFile::ReadOnly)) { QMessageBox::warning(NULL,"error","skin loading error!"); return 0; } QString qss = qssFile.readAll(); a.setStyleSheet(qss); qssFile.close(); MainWindow *w = new MainWindow; // QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312")); // QSplashScreen *splash = new QSplashScreen; // splash->setPixmap(QPixmap("images/loading.png")); // //splash->setWindowOpacity(0.9); // splash->show(); // Qt::Alignment topRight = Qt::AlignHCenter | Qt::AlignBottom; // splash->showMessage(QObject::tr("正在啟動主介面..."),topRight, Qt::black); // splash->showMessage(QObject::tr("正在載入資料庫模組..."),topRight, Qt::black); // splash->showMessage(QObject::tr("正在載入..."),topRight, Qt::black); // QDateTime n2=QDateTime::currentDateTime(); // QDateTime now; // do{ // now=QDateTime::currentDateTime(); // }while (n2.secsTo(now)<=5);//5為需要延時的秒數 // splash->finish(w); // w->setObjectName("MainWindow"); w->setFixedHeight(800); w->setFixedWidth(1400); // w->setWindowOpacity(1); w->setWindowFlags(Qt::FramelessWindowHint); w->setAttribute(Qt::WA_StyleSheet); w->move((QApplication::desktop()->width() - w->width())/2,(QApplication::desktop()->height() - w->height())/2); w->show(); return a.exec(); }
QT個人學習資源網站: https://www.qijiabo.cn 歡迎大家一起學習交流!
原始碼下載:
http://download.csdn.net/detail/zuoyuexian/9768445
相關推薦
QT 扁平化介面風格,自定義TabWidget控制元件
直接上圖先看效果: 核心程式碼: mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtCharts> QT_CHARTS_USE_NAMESPACE #include <
Qt--串列埠接收資料,自定義碼流
串列埠通訊,傳送的資料沒有打包成固定碼流,所有需要對接收的資料加以判斷。 解決串列埠接收不完整的方法有3種: 一:判斷接收的資料,是不是自己定義的字元格式。 二:判斷接收的資料包大小,是不是自己定義的資料包的大小。 三:以多執行緒的方式,執行緒一直接收,資料獨立處理,此方法
Android 自定義RatingBar控制元件,顯示不全問題
最近專案要用到 自定義RatingBar控制元件 但是自定義好了樣式發現,星星只顯示一半,於是在網上找各種解決方法。 最後竟然是直接把資源圖片,移動到較高解析度的資料夾裡面。 我的解決做法如下,如果有更好的方法,請留言告知。 一,先寫一個drawable,設定好backg
自定義RatingBar控制元件,實現可自定義星星(或專案所需圖片)的寬高,告別使用warp_content導致控制元件大小不可控
之前做過的一款app中涉及到RatingBar控制元件,基本上來說都會要求用圖片來替代, 即使同樣是星星(可能是覺得系統自帶的比較醜吧,不過我覺得還好啊)。 當時就覺得很難去做適配,UI給的圖片沒法去控制寬高,只能使用warp_content來做, 可是這樣會導
Android UI開源元件庫BottomView ,第三方自定義UI控制元件
這裡分享一個Android的非常經典實用而且簡單方便的第三方UI控制元件庫:BottomView(小米的米UI也用到了這個) 實現功能: 可以在底部彈出的View裡自定義佈局; 可以自定義是否可以觸控外部消失; 可以自定義事件; 可以自定義外圍背景是否透明; 可以自定義動
vue自定義form控制元件,解決vue+layui組合時checkbutton和radiobutton事件被覆蓋問題
vue+layui組合時checkbutton和radiobutton事件會被layui覆蓋,導致資料無法繫結,需要自定義form表單控制元件,如下: VRadio.vue <template&
QT 自定義混合控制元件——基於View/Model/Delegate的QTableView/QTreewidget/Combobox實現
QT自定義控制元件,檢視本文章需要具備一定的View/Model基礎知識(沒有也可以看)。本文實現了在一個QTreeWidget中插入一個QTableView,然後再在QTableView的每一個item中插入一個QCombobox,當然知道了方法你可以在任意item中插入任
自定義WPF控制元件,封裝成DLL
開啟VS2015 1.新建專案 在選單欄——檔案——新建——專案——選擇 C# 類庫專案(ClassLibrary)——確定 2.新增必要引用 在解決方案管理器裡,“引用”上右鍵——新增引用——程式集(框架)——新增對System.Xaml的引用,注意在net frame
【QT】Qtcreator的設計模式中將控制元件提升為自定義的控制元件
測試環境 在工程中新增自定義的控制元件 如:MyWidget 進入設計模式,右鍵需要提升的控制元件(該控制元件的父類必須和自定義控制元件的父類相同,否則不能提升),選擇“提升為…”
H5+百度地圖自定義定位控制元件、呼叫H5+定位介面
由於百度地圖的定位控制元件是呼叫內建的定位介面,想要呼叫H5+的定位介面就不行,自己改造一下就好了 /** * Author 嶽曉 * * 自定義定位控制元件,呼叫H5+內建定位API */ (function(BMap){ var control =
在Winform介面使用自定義使用者控制元件及TabelPanel和StackPanel佈局控制元件
在很多時候,我們做一些非常規化的介面的時候,往往需要建立一些使用者控制元件,在其中繪製好一些基礎的介面塊,作為後續重複使用的一個單元,使用者控制元件同時也可以封裝處理一些簡單的邏輯。在開發Winform各種型別專案,我都時不時需要定製一些特殊的使用者控制元件,以方便在介面模組中反覆使用。我們一般是在自定義的使
WinForm中使用自定義Tooltip控制元件
private ToolTip tooltipCtr; 建構函式中: 隱藏預設的Tooltip:this.ShowCellToolTips = false; this.tooltipCtr = new ToolTip(); 設定停留時間(還有許多其他時間設定):thi
自定義的控制元件 實現一個繞圓圈的箭頭
自定義的類 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import
Android UI-自定義日曆控制元件
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
自定義titilbar控制元件
自定義titilbar控制元件 自定義佈局 <?xml version="1.0" encoding="utf-8"?> <ImageView android:id="@+id/imageView1" android:layout_width=
android開發:自定義組合控制元件
內容介紹 本文記錄,自定義組合控制元件,為了可以程式碼複用,減少程式碼量 配置控制元件屬性檔案 開啟res/values/目錄下的arss.xml檔案,新增下面屬性程式碼,如果沒有建立arrs.xml檔案。 <?xml version="1.0" enc
android自定義開關控制元件-SlideSwitch
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
android 多功能自定義畫板控制元件(用於解決特定需求)
在專案中需要做一個可以自定義軌跡,但始終只有一條線,並且支援撤銷(撤銷單位為MotionEvent的down事件到up事件),還要支援動畫預覽等功能,最重要的是能夠按照間隔畫素來獲取所有點的座標,用於專案的其他功能。 整體的思路 1.專案中的應用場景需要畫板是一個圓形的,這個好實現用canv
(轉)C# 自定義使用者控制元件
C# 自定義使用者控制元件 轉:https://blog.csdn.net/xiongxuanwen/article/details/2605109 本例是製作一個簡單的自定義控制元件,然後用一個簡單的測試程式,對於初學者來說,本例子比較簡單,只能起到拋石引玉的效
自定義View控制元件
xml裡面的 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="