• Use CAknEnumeratedTextPopupSettingItem dynamically at runtime(转)


    Use CAknEnumeratedTextPopupSettingItem dynamically at runtime

    In an article -- "Create Dynamic Settings Pages", there is a section describing how to "Adding Enumerated Text Item". See it for details.

    In this article, I will introduce another way -- creating a CAknEnumeratedTextPopupSettingItem-derived class to use dynamic data at runtime.

    An important note: "Setting Item Lis 6" panic will occur when no match found in the EnumeratedTextArray, not zero-based. To demonstrate this, I will use 1,2,10 for the enumeration values, different from those(0,1,10) in the above article. We will see how to fix it also.

    Contents

     [hide]

    Create test data

    First we need some test data, and then load the test data when calling CompleteConstructionL() function.

    void CMyTextPopupSettingItem::LoadTestDataL()
    {
    _LIT(KFirst, "first (1)");
    _LIT(KSecond, "second (2)");
    _LIT(KThird, "third (10)");
     
    // Get the value array
    CArrayPtr<CAknEnumeratedText>* texts = this->EnumeratedTextArray();
    CArrayPtr<HBufC>* popTextArr = this->PoppedUpTextArray();
    // Empty it
    if (texts && popTextArr)
    {
    texts->ResetAndDestroy();
    texts->AppendL(new CAknEnumeratedText(1, KFirst().AllocL()));
    texts->AppendL(new CAknEnumeratedText(2, KSecond().AllocL()));
    texts->AppendL(new CAknEnumeratedText(10, KThird().AllocL()));
    popTextArr->ResetAndDestroy();
    popTextArr->AppendL(KFirst().AllocL());
    popTextArr->AppendL(KSecond().AllocL());
    popTextArr->AppendL(KThird().AllocL());
    }
    }
     
    void CMyTextPopupSettingItem::CompleteConstructionL()
    {
    CAknEnumeratedTextPopupSettingItem::CompleteConstructionL();
    LoadTestDataL(); // overwrite the resource definitions.
    }

    Check target value

    We must check whether the target value, iValue, is in the loaded array or not. If not, it definitely causes a panic -- "Setting Item Lis 6". In that case, we will choose the first item as the default one. See below:

    void CMyTextPopupSettingItem::LoadL()
    {
    CArrayPtr<CAknEnumeratedText>* texts = this->EnumeratedTextArray();
    TInt selectedIndex = this->IndexFromValue(iValue);
    if (selectedIndex < 0) // no match found.
    {
    if (texts->Count() > 0)
    {
    // choose the first item as default one.
    CAknEnumeratedText* item = texts->At(0);
    // reset external value to the default one.
    this->SetExternalValue(item->EnumerationValue());
    }
    }
    CAknEnumeratedTextPopupSettingItem::LoadL();
    }

    constructor, etc

    The constructor of CMyTextPopupSettingItem:

    CMyTextPopupSettingItem::CMyTextPopupSettingItem( TInt aIdentifier, TInt& aValue )
    : CAknEnumeratedTextPopupSettingItem(aIdentifier, aValue), iValue(aValue)
    {
    }

    The implementation of CreateAndExecuteSettingPageL:

    void CMyTextPopupSettingItem::CreateAndExecuteSettingPageL()
    {
    CAknSettingPage* dlg = CreateSettingPageL();
     
    SetSettingPage( dlg );
    SettingPage()->SetSettingPageObserver(this);
     
    SettingPage()->SetSettingTextL(SettingName());
     
    SettingPage()->ExecuteLD(CAknSettingPage::EUpdateWhenChanged);
    SetSettingPage(0);
    }

    The header file

    class CMyTextPopupSettingItem : public CAknEnumeratedTextPopupSettingItem
    {
    public: // Constructor
    CMyTextPopupSettingItem( TInt aIdentifier, TInt& aValue );
    void LoadL();
     
    protected: // Functions from base classes
    void CreateAndExecuteSettingPageL();
    void CompleteConstructionL();
     
    private: // custom methods
    void LoadTestDataL();
     
    private:
    TInt iValue;
    };

    Use CMyTextPopupSettingItem

    In the CreateSettingItemL method of your Setting List container, add some code like this:

    case EMyAppItemTest:
    {
    // iData = 1; // here you can specify the default value to test the class we have just created.
    // iData = 0; // This will cause a panic if no fixes in LoadL function.
    settingItem = new (ELeave) CMyTextPopupSettingItem(aIdentifier, iData);
    break;
    }

    See also

  • 相关阅读:
    Python格式化输出%s和%d
    操作数据库
    协议类介绍
    并发和并行和压测 、对带宽的理解解释
    悠悠大神的 并发当前目录下所有文件的方法(还没试过)
    post参数的方法 json data 和特别的传参
    接口测试简介
    appium的三种等待方式 (还没实践过,记录在此)
    人生进步目标
    保持一个会话 添加 HTTP Cookie管理器
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/1848907.html
Copyright © 2020-2023  润新知